Import Data

corrcounts_merge <- readRDS("~/VersionControl/senescence_benchmarking/Data/corrcounts_merge.rds")
metadata_merge <- readRDS("~/VersionControl/senescence_benchmarking/Data/metadata_merge.rds")
SenescenceSignatures <- readRDS("~/VersionControl/senescence_benchmarking/CommonFiles/SenescenceSignatures_divided_newCellAge.RDS")
set.seed("123456")
metadata_merge_corr <- metadata_merge
metadata_merge_corr$random_cat <-  sample(c("A","B","C"), nrow(metadata_merge_corr), replace = T)
metadata_merge_corr$random_numeric <- sample(0:100, nrow(metadata_merge_corr), replace = TRUE)
metadata_merge_corr$Is_Senescent <- ifelse(metadata_merge_corr$Condition == "Senescent", "Senescent", "Non Senescent")
library(markeR)
library(ggplot2)
library(ggpubr)
library(edgeR)
?markeR

Scores

?CalculateScores
ℹ Rendering development documentation for "CalculateScores"

Unidirectional

df_ssGSEA <- CalculateScores(data = corrcounts_merge, metadata = metadata_merge, method = "ssGSEA", gene_sets = SenescenceSignatures)

senescence_triggers_colors <- c(
  "none" = "#E57373",  # Soft red  
  "Radiation" = "#BDBDBD",  # Medium gray  
  "DNA damage" = "#64B5F6",  # Brighter blue  
  "Telomere shortening" = "#4FC3F7",  # Vivid sky blue  
  "DNA demethylation" = "#BA68C8",  # Rich lavender  
  "Oxidative stress" = "#FDD835",  # Strong yellow  
  "Conditioned Medium" = "#F2994A",  # Warm orange  
  "Oncogene" = "#81C784",  # Medium green  
  "Lipid Accumulation" = "#E57373",  # Coral  
  "Calcium influx" = "#26A69A",  # Deep teal  
  "Plasma membrane dysruption" = "#D32F2F",  # Strong salmon  
  "OSKM factors" = "#FFB74D",  # Bright peach  
  "YAP KO" = "#9575CD"  # Deep pastel purple  
)

cellTypes_colors <- c(
  "Fibroblast" = "#FF6961",   # Strong Pastel Red  
  "Keratinocyte" = "#FFB347", # Strong Pastel Orange  
  "Melanocyte" = "#FFD700",   # Strong Pastel Yellow  
  "Endothelial" = "#77DD77",  # Strong Pastel Green  
  "Neuronal" = "#779ECB",     # Strong Pastel Blue  
  "Mesenchymal" = "#C27BA0"   # Strong Pastel Purple  
)

cond_cohend <- list(A=c("Senescent"), # if no variable is defined, will be the first that appears in the ggplot
                    B=c("Proliferative","Quiescent"))

PlotScores(ResultsList = df_ssGSEA, ColorVariable = "CellType", GroupingVariable="Condition",  method ="ssGSEA", ColorValues = cellTypes_colors, ConnectGroups=TRUE, ncol = 6, nrow = 2, widthTitle=20, y_limits = NULL, legend_nrow = 2,cond_cohend=cond_cohend)
df_logmedian <- CalculateScores(data = corrcounts_merge, metadata = metadata_merge, method = "logmedian", gene_sets = SenescenceSignatures)

senescence_triggers_colors <- c(
  "none" = "#E57373",  # Soft red  
  "Radiation" = "#BDBDBD",  # Medium gray  
  "DNA damage" = "#64B5F6",  # Brighter blue  
  "Telomere shortening" = "#4FC3F7",  # Vivid sky blue  
  "DNA demethylation" = "#BA68C8",  # Rich lavender  
  "Oxidative stress" = "#FDD835",  # Strong yellow  
  "Conditioned Medium" = "#F2994A",  # Warm orange  
  "Oncogene" = "#81C784",  # Medium green  
  "Lipid Accumulation" = "#E57373",  # Coral  
  "Calcium influx" = "#26A69A",  # Deep teal  
  "Plasma membrane dysruption" = "#D32F2F",  # Strong salmon  
  "OSKM factors" = "#FFB74D",  # Bright peach  
  "YAP KO" = "#9575CD"  # Deep pastel purple  
)

cellTypes_colors <- c(
  "Fibroblast" = "#FF6961",   # Strong Pastel Red  
  "Keratinocyte" = "#FFB347", # Strong Pastel Orange  
  "Melanocyte" = "#FFD700",   # Strong Pastel Yellow  
  "Endothelial" = "#77DD77",  # Strong Pastel Green  
  "Neuronal" = "#779ECB",     # Strong Pastel Blue  
  "Mesenchymal" = "#C27BA0"   # Strong Pastel Purple  
)

cond_cohend <- list(A=c("Senescent"), # if no variable is defined, will be the first that appears in the ggplot
                    B=c("Proliferative","Quiescent"))

PlotScores(ResultsList = df_logmedian, ColorVariable = "CellType", GroupingVariable="Condition",  method ="logmedian", ColorValues = cellTypes_colors, ConnectGroups=TRUE, ncol = 6, nrow = 2, widthTitle=20, y_limits = NULL, legend_nrow = 2,xlab=NULL, cond_cohend = cond_cohend)

df_ranking <- CalculateScores(data = corrcounts_merge, metadata = metadata_merge, method = "ranking", gene_sets = SenescenceSignatures)
Considering unidirectional gene signature mode for signature [DOWN]_CellAge
Considering unidirectional gene signature mode for signature [DOWN]_HernandezSegura
Considering unidirectional gene signature mode for signature [DOWN]_SeneQuest
Considering unidirectional gene signature mode for signature [UP]_CellAge
Considering unidirectional gene signature mode for signature [UP]_HernandezSegura
Considering unidirectional gene signature mode for signature [UP]_SeneQuest
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
senescence_triggers_colors <- c(
  "none" = "#E57373",  # Soft red  
  "Radiation" = "#BDBDBD",  # Medium gray  
  "DNA damage" = "#64B5F6",  # Brighter blue  
  "Telomere shortening" = "#4FC3F7",  # Vivid sky blue  
  "DNA demethylation" = "#BA68C8",  # Rich lavender  
  "Oxidative stress" = "#FDD835",  # Strong yellow  
  "Conditioned Medium" = "#F2994A",  # Warm orange  
  "Oncogene" = "#81C784",  # Medium green  
  "Lipid Accumulation" = "#E57373",  # Coral  
  "Calcium influx" = "#26A69A",  # Deep teal  
  "Plasma membrane dysruption" = "#D32F2F",  # Strong salmon  
  "OSKM factors" = "#FFB74D",  # Bright peach  
  "YAP KO" = "#9575CD"  # Deep pastel purple  
)

cellTypes_colors <- c(
  "Fibroblast" = "#FF6961",   # Strong Pastel Red  
  "Keratinocyte" = "#FFB347", # Strong Pastel Orange  
  "Melanocyte" = "#FFD700",   # Strong Pastel Yellow  
  "Endothelial" = "#77DD77",  # Strong Pastel Green  
  "Neuronal" = "#779ECB",     # Strong Pastel Blue  
  "Mesenchymal" = "#C27BA0"   # Strong Pastel Purple  
)

cond_cohend <- list(A=c("Senescent"), # if no variable is defined, will be the first that appears in the ggplot
                    B=c("Proliferative","Quiescent"))

PlotScores(ResultsList = df_ranking, ColorVariable = "CellType", GroupingVariable="Condition",  method ="ranking", ColorValues = cellTypes_colors, ConnectGroups=TRUE, ncol = 6, nrow = 2, widthTitle=20, y_limits = NULL, legend_nrow = 2,xlab=NULL, cond_cohend = cond_cohend)


plotlist <- list()

for (sig in names(df_ssGSEA)){
  
  df_subset_ssGSEA <- df_ssGSEA[[sig]]
  df_subset_logmedian <- df_logmedian[[sig]]
  
  df_subset_merge <- merge(df_subset_ssGSEA,df_subset_logmedian,by="sample")
  
  # Wrap the signature name using the helper function
  wrapped_title <- wrap_title_aux(sig, width = 20)  
  
  plotlist[[sig]] <- ggplot2::ggplot(df_subset_merge, aes(x=score.x, y=score.y)) +
    geom_point(size=4, alpha=0.8, fill="darkgrey", shape=21) +
    theme_bw() +
    xlab("ssGSEA Enrichment Score") +
    ylab("Normalised Signature Score") +
    ggtitle(wrapped_title) +
    theme(plot.title = ggplot2::element_text(hjust = 0.5, size=10),
          plot.subtitle = ggplot2::element_text(hjust = 0.5)) 
  
}

ggpubr::ggarrange(plotlist=plotlist, nrow=3, ncol=4, align = "h")

Bidirectional gene signatures

Try scores with bidirectional signatures

bidirectsigs <- readRDS("~/VersionControl/senescence_benchmarking/CommonFiles/SenescenceSignatures_complete_newCellAge.RDS")
for (sig in names(bidirectsigs)){
  sigdf <- bidirectsigs[[sig]]
  sigdf <- sigdf[,1:2] # remove the third column, if applicable
  if(any(sigdf[,2]=="not_reported")){
    sigdf <- sigdf[,1]
    bidirectsigs[[sig]] <- sigdf
    next 
  }
  sigdf[,2] <- ifelse(sigdf[,2]=="enriched",1,-1)
  bidirectsigs[[sig]] <- sigdf
}
bidirectsigs
$CellAge

$CSgene
  [1] "TP53"       "TERF2"      "MAPK14"     "CDKN2A"     "CDKN1A"     "CCNE1"      "CCNA1"      "MAPKAPK5"   "CBX4"       "TXN"       
 [11] "TBX2"       "STAT3"      "SRF"        "BMI1"       "MAP2K4"     "MAP2K6"     "MAP2K3"     "MAPK8"      "MAPK3"      "MAPK1"     
 [21] "PRKCD"      "PML"        "OPA1"       "ATM"        "MDM2"       "CXCL8"      "IL6"        "IGFBP7"     "ID1"        "HRAS"      
 [31] "H2AFX"      "POT1"       "SIRT1"      "KDM6B"      "PLA2R1"     "EZH2"       "E2F3"       "E2F1"       "CEBPB"      "CDKN2D"    
 [41] "CDKN2B"     "CDKN1B"     "CDK6"       "CDK4"       "CDK2"       "CDC42"      "RBX1"       "CDC27"      "CDK1"       "MAML1"     
 [51] "CD44"       "MAD2L1BP"   "MAP4K4"     "AIM2"       "RECQL4"     "ARHGAP18"   "KL"         "MAPKAPK2"   "AURKB"      "SLC16A7"   
 [61] "CCNE2"      "HIST1H2BJ"  "HIST1H3F"   "CCNA2"      "MCM3AP"     "CDC16"      "TSC22D1"    "CBS"        "TNFSF13"    "CTNNAL1"   
 [71] "EED"        "PNPT1"      "CDC23"      "RNASET2"    "TP63"       "CAV1"       "MKNK1"      "TSLP"       "HIST1H2BK"  "PPM1D"     
 [81] "HAVCR2"     "CBX2"       "KDM2B"      "DPY30"      "C2orf40"    "YPEL3"      "HIST2H4A"   "HIST1H4L"   "HIST1H4E"   "HIST1H4B"  
 [91] "HIST1H4H"   "HIST1H4C"   "HIST1H4J"   "HIST1H4K"   "HIST1H4F"   "HIST1H4D"   "HIST1H4A"   "HIST1H3B"   "HIST1H3H"   "HIST1H3J"  
[101] "HIST1H3G"   "HIST1H3I"   "HIST1H3E"   "HIST1H3C"   "HIST1H3D"   "HIST1H3A"   "HIST2H2BE"  "HIST1H2BO"  "HIST1H2BC"  "HIST1H2BI" 
[111] "HIST1H2BH"  "HIST1H2BE"  "HIST1H2BF"  "HIST1H2BM"  "HIST1H2BN"  "HIST1H2BL"  "HIST1H2BG"  "HIST2H2AC"  "HIST2H2AA3" "HIST1H2AB" 
[121] "HIST1H2AC"  "HIST1H2AJ"  "HIST1H4I"   "HIST3H3"    "CALR"       "HMGA2"      "PHC3"       "KAT6A"      "EHMT1"      "SMC6"      
[131] "AIMP2"      "CALCA"      "DEK"        "MAPKAPK3"   "ZNF148"     "YY1"        "WRN"        "WNT5A"      "NR1H2"      "UBE3A"     
[141] "UBE2E1"     "UBE2D1"     "UBC"        "UBB"        "UBA52"      "CDC26P1"    "TYMS"       "TWIST1"     "HIRA"       "RPS27AP11" 
[151] "HIST2H2AA4" "TP73"       "TOP 1,00"   "TNF"        "TGFB2"      "TGFB1"      "TFDP1"      "TERT"       "TERF1"      "BUB1B"     
[161] "BUB1"       "TCF3"       "TBX3"       "TAGLN"      "STAT6"      "STAT1"      "BRAF"       "SREBF1"     "BRCA1"      "SP1"       
[171] "SOX5"       "SOD2"       "SNAI1"      "SMARCB1"    "SMARCA2"    "HIST2H3D"   "PHC1P1"     "ACD"        "SKIL"       "LOC649620" 
[181] "SLC13A3"    "LOC647654"  "SMURF2"     "ANAPC1"     "SHC1"       "CPEB1"      "H3F3AP6"    "ZMAT3"      "RBBP4P1"    "SRSF3"     
[191] "SRSF1"      "SATB1"      "S100A6"     "RXRB"       "RRM2"       "RRM1"       "RPS27A"     "RPS6KA3"    "RPS6KA2"    "RPS6KA1"   
[201] "RPL5"       "RNF2"       "RIT1"       "RING1"      "BCL2L1"     "RELA"       "BCL2"       "CCND1"      "RBP2"       "RBL2"      
[211] "RBL1"       "RBBP7"      "RBBP4"      "NTN4"       "RB1"        "IL21"       "RAN"        "RAF1"       "RAC1"       "TNRC6C"    
[221] "KIAA1524"   "EP400"      "CNOT6"      "CBX8"       "PTEN"       "SEPN1"      "BACH1"      "PSMB5"      "PROX1"      "PRL"       
[231] "MAP2K7"     "MAP2K1"     "MAPK10"     "MAPK9"      "MAPK11"     "MAPK7"      "PRKDC"      "RNF114"     "PRKCI"      "ATF7IP"    
[241] "MFN1"       "PRKAA2"     "CDKN2AIP"   "RBM38"      "PRG2"       "HIST2H4B"   "HJURP"      "TMEM140"    "PBRM1"      "Mar-05"    
[251] "PPARG"      "PPARD"      "POU2F1"     "TERF2IP"    "ERRFI1"     "H2BFS"      "PLK1"       "PLAUR"      "PIN1"       "PIM1"      
[261] "PIK3CA"     "PHB"        "PGR"        "PGD"        "PIAS4"      "PDGFB"      "SIRT6"      "ANAPC11"    "ANAPC7"     "ANAPC5"    
[271] "WNT16"      "FZR1"       "ZBTB7A"     "ERGIC2"     "PCNA"       "FIS1"       "PAX3"       "NOX4"       "MINK1"      "PEBP1"     
[281] "YBX1"       "NINJ1"      "NFKB1"      "H2AFB1"     "NDN"        "NCAM1"      "NBN"        "MYC"        "MYBL2"      "MSN"       
[291] "ASS1"       "LOC441488"  "MRE11A"     "MOV10"      "MMP7"       "MIF"        "MAP3K5"     "MAP3K1"     "MECP2"      "MCL1"      
[301] "MAGEA2"     "SMAD9"      "SMAD7"      "SMAD6"      "SMAD5"      "SMAD4"      "SMAD3"      "SMAD2"      "SMAD1"      "MAD2L1"    
[311] "MXD1"       "MIR34A"     "MIR30A"     "MIR299"     "MIR29A"     "MIR22"      "MIR217"     "MIR21"      "MIR205"     "MIR203A"   
[321] "MIR191"     "MIR146A"    "MIR141"     "MIR10B"     "ARNTL"      "LMNB1"      "LMNA"       "LGALS9"     "RHOA"       "KRT5"      
[331] "KRAS"       "KIT"        "KIR2DL4"    "KCNJ12"     "JUN"        "JAK2"       "ITGB4"      "IRS1"       "IRF7"       "IRF5"      
[341] "IRF3"       "ING1"       "IDO1"       "ILF3"       "IL15"       "IL12B"      "CXCR2"      "IL4"        "IGFBP5"     "IGFBP3"    
[351] "IGFBP1"     "IGF1R"      "IGF1"       "H3F3AP5"    "IFNG"       "IFI16"      "IDH1"       "ID2"        "HIST2H3A"   "BIRC5"     
[361] "HSPB1"      "HSPA9"      "HSPA5"      "HSPA1A"     "APEX1"      "HNRNPA1"    "FOXA3"      "FOXA2"      "FOXA1"      "HMGA1"     
[371] "HIF1A"      "ANXA5"      "HELLS"      "HDAC1"      "H3F3B"      "H3F3A"      "HIST1H2BB"  "HIST1H2BD"  "H2AFZ"      "HIST1H2AD" 
[381] "HIST1H2AE"  "ANAPC4"     "ANAPC2"     "UBN1"       "SENP1"      "GUCY2C"     "GSK3B"      "UHRF1"      "BRD7"       "NSMCE2"    
[391] "PTRF"       "GPI"        "GNAO1"      "RPS6KA6"    "TNRC6A"     "AGO2"       "B3GAT1"     "DNAJC2"     "GJA1"       "AGO1"      
[401] "EHF"        "TINF2"      "LDLRAP1"    "ULK3"       "GAPDH"      "ABI3BP"     "ASF1A"      "HIST1H2BA"  "G6PD"       "ACKR1"     
[411] "MTOR"       "CDC26"      "CNOT6L"     "FOS"        "CABIN1"     "MORC3"      "SUZ12"      "NPTXR"      "CBX6"       "SIRT3"     
[421] "CRTC1"      "PPP1R13B"   "SUN1"       "SMC5"       "TNRC6B"     "FOXO1"      "FOXM1"      "TNIK"       "SCMH1"      "DKK 1,00"  
[431] "FGFR2"      "FGF2"       "HEPACAM"    "FANCD2"     "EWSR1"      "ETS2"       "ETS1"       "ESR2"       "ERF"        "AKT1"      
[441] "EREG"       "ERBB2"      "ENG"        "ELN"        "CRTC2"      "EIF5A"      "EGR1"       "EGFR"       "EEF1B2"     "AGO4"      
[451] "AGO3"       "EEF1A1"     "PHC2"       "PHC1"       "ABCA1"      "E2F2"       "DUSP6"      "DUSP4"      "HBEGF"      "AGT"       
[461] "DNMT3A"     "AGER"       "DKC1"       "DAXX"       "CYP3A4"     "CTSZ"       "CTSD"       "CSNK2A1"    "E2F7"       "PARP1"     
[471] "HIST3H2BB"  "HIST2H3C"   "JDP2"       "HIST4H4"    "CLU"        "CKB"        "RASSF1"     "CHEK1"      "TOPBP1"     "UBE2C"     
[481] "KIF2C"      "BTG3"       "EHMT2"      "GADD45G"    "NEK6"       "ZMYND11"    "SPINT2"     "CENPA"      "AGR2"       "CEBPG"     
[491] "HYOU1"      "TADA3"      "MCRS1"      "NDRG1"      "ANAPC10"    "CDKN2C"     "ZMPSTE24"   "PSMD14"     "NAMPT"      "RAD50"     
[501] "TRIM10"     "DNM1L"      "BCL2L11"   

$GOBP_CELLULAR_SENESCENCE
  [1] "AKT3"     "MIR543"   "CDK2"     "CDK6"     "CDKN1A"   "ZMPSTE24" "CDKN1B"   "CDKN2A"   "CDKN2B"   "CITED2"   "KAT5"     "PLK2"    
 [13] "NEK6"     "ZNF277"   "CGAS"     "COMP"     "MAPK14"   "VASH1"    "PLA2R1"   "SMC5"     "SIRT1"    "MORC3"    "NUP62"    "ABL1"    
 [25] "ULK3"     "RSL1D1"   "FBXO5"    "FBXO4"    "MAGEA2B"  "NSMCE2"   "H2AX"     "HLA-G"    "HMGA1"    "HRAS"     "ID2"      "IGF1R"   
 [37] "ING2"     "KIR2DL4"  "ARG2"     "LMNA"     "BMAL1"    "MIR10A"   "MIR146A"  "MIR17"    "MIR188"   "MIR217"   "MIR22"    "MIR34A"  
 [49] "MAGEA2"   "MAP3K3"   "MAP3K5"   "MIF"      "MNT"      "ATM"      "NPM1"     "YBX1"     "OPA1"     "PAWR"     "ABI3"     "FZR1"    
 [61] "WNT16"    "SIRT6"    "PML"      "PRMT6"    "PRELP"    "PRKCD"    "MAPK8"    "MAPK11"   "MAPK9"    "MAPK10"   "MAP2K1"   "MAP2K3"  
 [73] "MAP2K6"   "MAP2K7"   "B2M"      "ZMIZ1"    "PTEN"     "MIR20B"   "RBL1"     "BCL6"     "MAP2K4"   "BMPR1A"   "SPI1"     "SRF"     
 [85] "BRCA2"    "NEK4"     "TBX2"     "TBX3"     "MIR590"   "TERC"     "TERF2"    "TERT"     "TOP2B"    "TP53"     "TWIST1"   "WNT1"    
 [97] "WRN"      "SMC6"     "KAT6A"    "ZKSCAN3"  "HMGA2"    "CALR"     "YPEL3"    "ECRG4"    "MAPKAPK5" "TP63"     "PNPT1"    "DNAJA3"  
[109] "EEF1E1"   "NUAK1"   

$GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE

$GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE

$HernandezSegura

$REACTOME_CELLULAR_SENESCENCE
  [1] "CDC27"    "E2F2"     "SCMH1"    "MRE11"    "MAP2K3"   "MAPK9"    "ANAPC4"   "MAP2K4"   "MAP4K4"   "RPS6KA2"  "UBE2D1"   "EED"     
 [13] "MAP2K7"   "TNRC6C"   "MAPKAPK5" "ANAPC5"   "TNRC6A"   "TINF2"    "AGO1"     "CDC23"    "CABIN1"   "MAPK1"    "HIRA"     "TNRC6B"  
 [25] "E2F1"     "RBBP7"    "MAPK3"    "ACD"      "NBN"      "CCNE1"    "FZR1"     "ERF"      "CDK6"     "H2AZ2"    "EZH2"     "MAPK8"   
 [37] "UBE2S"    "MAP2K6"   "NFKB1"    "MAPK10"   "ANAPC15"  "CDKN1B"   "PHC1"     "ASF1A"    "MAPK14"   "E2F3"     "LMNB1"    "RAD50"   
 [49] "TFDP2"    "MAPKAPK3" "IL1A"     "RPS6KA1"  "UBN1"     "RNF2"     "CDKN2C"   "CDK2"     "H1-3"     "H1-1"     "H2BC11"   "CDKN1A"  
 [61] "ID1"      "AGO3"     "POT1"     "CDKN2D"   "CDC16"    "H3-3B"    "KDM6B"    "TERF2"    "CCNA1"    "PHC2"     "AGO4"     "ETS1"    
 [73] "CDK4"     "MDM2"     "IL6"      "TXN"      "HMGA1"    "RB1"      "MINK1"    "TP53"     "ANAPC11"  "CBX8"     "CBX4"     "RPS27A"  
 [85] "CCNA2"    "H2BC1"    "TERF1"    "CDKN2B"   "CDKN2A"   "ATM"      "HMGA2"    "UBC"      "VENTX"    "ANAPC1"   "TNIK"     "MOV10"   
 [97] "ETS2"     "H2BC5"    "H4C8"     "RBBP4"    "MAPKAPK2" "H3-3A"    "IGFBP7"   "ANAPC10"  "ANAPC16"  "MAPK7"    "TERF2IP"  "H3-4"    
[109] "BMI1"     "H1-4"     "STAT3"    "CXCL8"    "UBE2E1"   "UBB"      "FOS"      "IFNB1"    "CEBPB"    "KAT5"     "RELA"     "PHC3"    
[121] "CBX2"     "UBE2C"    "CCNE2"    "ANAPC2"   "CDC26"    "RPS6KA3"  "JUN"      "SUZ12"    "H2AC6"    "H2BC4"    "EHMT1"    "EP400"   
[133] "H3C13"    "CBX6"     "H2AC20"   "H1-5"     "H2BC21"   "H2BC13"   "MAPK11"   "SP1"      "H1-2"     "H2AX"     "H1-0"     "ANAPC7"  
[145] "H2AC7"    "H2BC26"   "H4C3"     "H3C12"    "H4C11"    "H3C4"     "MAP3K5"   "H4C16"    "H2BC12"   "TFDP1"    "MDM4"     "H3C14"   
[157] "H3C15"    "RING1"    "EHMT2"    "UBA52"    "H2AJ"     "H4C15"    "H4C14"    "H4C12"    "H2BC14"   "H2BC8"    "H3C8"     "H2AB1"   
[169] "H2BC6"    "H4C6"     "H2BC17"   "H3C6"     "H4C13"    "H3C11"    "H2BC9"    "H3C1"     "H4C9"     "H2AC14"   "H2BC3"    "H4C5"    
[181] "H2AC8"    "H4C4"     "H2BC7"    "H3C7"     "H2AC4"    "H2BC10"   "H4C1"     "H4C2"     "H3C10"    "MIR24-2"  "MIR24-1"  "H3C2"    
[193] "H3C3"     "H2AC18"   "H2AC19"  

$SAUL_SEN_MAYO

$SeneQuest
NA
PlotScores(data = corrcounts_merge, metadata = metadata_merge, method = "logmedian", gene_sets = bidirectsigs,  ColorVariable = "CellType", GroupingVariable="Condition",   ColorValues = cellTypes_colors, ConnectGroups=TRUE, ncol = 3, nrow = 3, widthTitle=20, limits = NULL, legend_nrow = 2,xlab=NULL, cond_cohend = cond_cohend, compute_cohen=T)
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest

PlotScores(data = corrcounts_merge, metadata = metadata_merge, method = "logmedian", gene_sets = bidirectsigs,  ColorVariable = "CellType", GroupingVariable="Condition",   ColorValues = cellTypes_colors, ConnectGroups=TRUE, ncol = 3, nrow = 3, widthTitle=20, limits = NULL, legend_nrow = 2,xlab=NULL, cond_cohend = NULL, compute_cohen=T, pvalcalc = F)
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest

 
df_ssgsea <- CalculateScores(data = corrcounts_merge, metadata = metadata_merge, method = "ssGSEA", gene_sets = bidirectsigs)
Considering bidirectional gene signature mode for signature CellAge
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature CSgene
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature HernandezSegura
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature SeneQuest
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
Warning: useNames = NA is deprecated. Instead, specify either useNames = TRUE or useNames = FALSE.
No id variables; using all as measure variables
senescence_triggers_colors <- c(
  "none" = "#E57373",  # Soft red  
  "Radiation" = "#BDBDBD",  # Medium gray  
  "DNA damage" = "#64B5F6",  # Brighter blue  
  "Telomere shortening" = "#4FC3F7",  # Vivid sky blue  
  "DNA demethylation" = "#BA68C8",  # Rich lavender  
  "Oxidative stress" = "#FDD835",  # Strong yellow  
  "Conditioned Medium" = "#F2994A",  # Warm orange  
  "Oncogene" = "#81C784",  # Medium green  
  "Lipid Accumulation" = "#E57373",  # Coral  
  "Calcium influx" = "#26A69A",  # Deep teal  
  "Plasma membrane dysruption" = "#D32F2F",  # Strong salmon  
  "OSKM factors" = "#FFB74D",  # Bright peach  
  "YAP KO" = "#9575CD"  # Deep pastel purple  
)

cellTypes_colors <- c(
  "Fibroblast" = "#FF6961",   # Strong Pastel Red  
  "Keratinocyte" = "#FFB347", # Strong Pastel Orange  
  "Melanocyte" = "#FFD700",   # Strong Pastel Yellow  
  "Endothelial" = "#77DD77",  # Strong Pastel Green  
  "Neuronal" = "#779ECB",     # Strong Pastel Blue  
  "Mesenchymal" = "#C27BA0"   # Strong Pastel Purple  
)

cond_cohend <- list(A=c("Senescent"), # if no variable is defined, will be the first that appears in the ggplot
                    B=c("Proliferative","Quiescent"))

PlotScores(ResultsList = df_ssgsea, ColorVariable = "CellType", GroupingVariable="Condition",  method ="ssGSEA", ColorValues = cellTypes_colors, ConnectGroups=TRUE, ncol = 3, nrow = 3, widthTitle=20, y_limits = NULL, legend_nrow = 2,xlab=NULL, cond_cohend = cond_cohend)

 
df_ranking <- CalculateScores(data = corrcounts_merge, metadata = metadata_merge, method = "ranking", gene_sets = bidirectsigs)
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
senescence_triggers_colors <- c(
  "none" = "#E57373",  # Soft red  
  "Radiation" = "#BDBDBD",  # Medium gray  
  "DNA damage" = "#64B5F6",  # Brighter blue  
  "Telomere shortening" = "#4FC3F7",  # Vivid sky blue  
  "DNA demethylation" = "#BA68C8",  # Rich lavender  
  "Oxidative stress" = "#FDD835",  # Strong yellow  
  "Conditioned Medium" = "#F2994A",  # Warm orange  
  "Oncogene" = "#81C784",  # Medium green  
  "Lipid Accumulation" = "#E57373",  # Coral  
  "Calcium influx" = "#26A69A",  # Deep teal  
  "Plasma membrane dysruption" = "#D32F2F",  # Strong salmon  
  "OSKM factors" = "#FFB74D",  # Bright peach  
  "YAP KO" = "#9575CD"  # Deep pastel purple  
)

cellTypes_colors <- c(
  "Fibroblast" = "#FF6961",   # Strong Pastel Red  
  "Keratinocyte" = "#FFB347", # Strong Pastel Orange  
  "Melanocyte" = "#FFD700",   # Strong Pastel Yellow  
  "Endothelial" = "#77DD77",  # Strong Pastel Green  
  "Neuronal" = "#779ECB",     # Strong Pastel Blue  
  "Mesenchymal" = "#C27BA0"   # Strong Pastel Purple  
)

cond_cohend <- list(A=c("Senescent"), # if no variable is defined, will be the first that appears in the ggplot
                    B=c("Proliferative","Quiescent"))

PlotScores(ResultsList = df_ranking, ColorVariable = "CellType", GroupingVariable="Condition",  method ="ranking", ColorValues = cellTypes_colors, ConnectGroups=TRUE, ncol = 3, nrow = 3, widthTitle=20, y_limits = NULL, legend_nrow = 2,xlab=NULL, cond_cohend = cond_cohend)

Testing numeric variables

metadata_merge_corr_2 <- metadata_merge_corr
metadata_merge_corr_2$numeric_condition <- as.numeric(unclass(factor(metadata_merge_corr_2$Condition)))
PlotScores(data = corrcounts_merge, 
           metadata = metadata_merge_corr_2, 
           method = "all", 
           gene_sets = bidirectsigs,  
           ColorVariable = NULL, 
           Variable="numeric_condition",   
           ColorValues = NULL, 
           ConnectGroups = T, 
           ncol = NULL, 
           nrow = NULL, 
           title = NULL,
           widthTitle = 20, 
           titlesize = 10, 
           limits = NULL, 
           legend_nrow = NULL, 
           pointSize = 2,
           xlab = "teste", 
           labsize = 9, 
           compute_cohen=TRUE, 
           cond_cohend = NULL, 
           pvalcalc = FALSE, 
           mode = "simple",
           widthlegend=22, 
           sig_threshold=0.05, 
           cohen_threshold=0.2,
           PointSize=6,
           colorPalette="Set3", 
           cor="pearson")
Considering bidirectional gene signature mode for signature CellAge
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature CSgene
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature HernandezSegura
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature SeneQuest
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
$heatmap

$volcano

Heatmap and Volcano for Cohen’s D

Scores_Overview_All <- PlotScores(data = corrcounts_merge, 
           metadata = metadata_merge,  
           gene_sets=bidirectsigs, 
           Variable="Condition",  
           method ="logmedian",   
           ncol = NULL, 
           nrow = NULL, 
           widthTitle=30, 
           limits = NULL,   
           title=NULL, 
           titlesize = 12,
           ColorValues = NULL,
           mode = "extensive",
           widthlegend=22, 
           sig_threshold=0.05, 
           cohend_threshold=0.6,
           PointSize=4,
           colorPalette="Set3")  
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
Scores_Overview_All$heatmap 

Scores_Overview_All$volcano


PlotScores(data = corrcounts_merge, 
           metadata = metadata_merge,  
           gene_sets=bidirectsigs, 
           GroupingVariable="Condition",  
           method ="all",   
           ncol = NULL, 
           nrow = NULL, 
           widthTitle=30, 
           limits = NULL,   
           title="Marthandan et al. 2016", 
           titlesize = 12,
           ColorValues = NULL,
           mode = "simple")  
Considering bidirectional gene signature mode for signature CellAge
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature CSgene
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature HernandezSegura
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature SeneQuest
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest

NA
NA
 plt2 <- ROC_Scores(data = corrcounts_merge, 
           metadata = metadata_merge_corr, 
           gene_sets=bidirectsigs, 
           method = "logmedian", 
           variable ="Condition",
           colors = "pink", 
           grid = TRUE, 
           spacing_annotation=0.35, 
           ncol=NULL, 
           nrow=NULL,
            mode = "simple",
            widthTitle = 28) 
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
 plt2 <- ROC_Scores(data = corrcounts_merge, 
           metadata = metadata_merge_corr, 
           gene_sets=bidirectsigs, 
           method = "logmedian", 
           variable ="Condition",
           colors = "pink", 
           grid = TRUE, 
           spacing_annotation=0.35, 
           ncol=NULL, 
           nrow=NULL,
            mode = "simple",
            widthTitle = 28) 
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
plt2

 plt2 <- ROC_Scores(data = corrcounts_merge, 
           metadata = metadata_merge_corr, 
           gene_sets=bidirectsigs, 
           method = "all", 
           variable ="Condition",
           colors = c(logmedian = "#3E5587", ssGSEA = "#B65285", ranking = "#B68C52"), 
           grid = TRUE, 
           spacing_annotation=0.35, 
           ncol=NULL, 
           nrow=NULL,
            mode = "simple",
            widthTitle = 28) 
Considering bidirectional gene signature mode for signature CellAge
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature CSgene
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature HernandezSegura
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature SeneQuest
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
plt2

NA

Association with Variable

If the user is investigating if a certain variable can be described from the score, and not already knowing that variable. More exploratory…

  • Define what each variable is: Numeric (includes integer if unique > 5), Categorical Bin (integer/string if unique == 2, logical), Categorical Multi (integer if unique < 5, string if unique > 2)
  • Define functions to calculate metrics based on different data types:
  • Categorical Bin: t-test/wilcoxon
  • Categorical Multi: ANOVA / Kruskal-Wallis + Tukey’s test
  • Numeric : Pearson / Spearman / Kendall’s Tau
  • Return a list:
  • One entry per variable
  • Method used
  • Data frame
  • Two columns: metric and p-value
  • One line per subvariable (if Numeric and Categorical Bin, only one line; for Categorical Multi, one per combination of variables); named rows
  • Plot results
  • If Numeric, scatter plot; metric on the top left corner
  • If Categorical, density plot, colored by the unique values of the variable; metrics (if one, or combinations of variables) in top left corner
  • Arrange in grid
plt <- AUC_Scores(data = corrcounts_merge, metadata=metadata_merge_corr, gene_sets=bidirectsigs, method = "all", variable="Condition", nrow = NULL, ncol = NULL, limits = NULL, widthTitle = 28, titlesize = 12, ColorValues = c("#F9F4AE", "#B44141"), title = NULL) 
Considering bidirectional gene signature mode for signature CellAge
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature CSgene
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature HernandezSegura
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
No id variables; using all as measure variables
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature SeneQuest
No id variables; using all as measure variables
No id variables; using all as measure variables
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
Considering bidirectional gene signature mode for signature CellAge
Considering unidirectional gene signature mode for signature CSgene
Considering unidirectional gene signature mode for signature GOBP_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_NEGATIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature GOBP_POSITIVE_REGULATION_OF_CELLULAR_SENESCENCE
Considering bidirectional gene signature mode for signature HernandezSegura
Considering unidirectional gene signature mode for signature REACTOME_CELLULAR_SENESCENCE
Considering unidirectional gene signature mode for signature SAUL_SEN_MAYO
Considering bidirectional gene signature mode for signature SeneQuest
plt

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiRXJyb3I6IGF0dGVtcHQgdG8gdXNlIHplcm8tbGVuZ3RoIHZhcmlhYmxlIG5hbWVcbiJ9 -->

Error: attempt to use zero-length variable name




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVWbUZ5YVdGaWJHVkJjM052WTJsaGRHbHZiaWh0WlhSaFpHRjBZVjlqYjNKeUxDQjBZWEpuWlhSZmRtRnlQVndpYzJOdmNtVmNJaXdnWTI5c2N5QTlJR01vWENKRGIyNWthWFJwYjI1Y0lpeGNJa2x6WDFObGJtVnpZMlZ1ZEZ3aUxGd2ljbUZ1Wkc5dFgyTmhkRndpTEZ3aWNtRnVaRzl0WDI1MWJXVnlhV05jSWlrc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBjMk55WlhSbFgyTnZiRzl5Y3lBOUlHeHBjM1FvU1hOZlUyVnVaWE5qWlc1MFBXTW9YQ0pUWlc1bGMyTmxiblJjSWoxY0luQnBibXRjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWs1dmJpQlRaVzVsYzJObGJuUmNJajFjSW05eVlXNW5aVndpS1Nrc0lGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiblJwYm5WdmRYTmZZMjlzYjNJZ1BTQmNJaU00UXpaRU1ETmNJaXdnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiM0pmY0dGc1pYUjBaU0E5SUZ3aVUyVjBNbHdpTENCdWNtOTNQVEVzSUhOcGVtVmhibTV2ZEQwekxDQnNaV2RsYm1RdWNHOXphWFJwYjI0OVhDSjBiM0JjSWlsY2JseHVZR0JnSW4wPSAtLT5cblxuYGBgclxuVmFyaWFibGVBc3NvY2lhdGlvbihtZXRhZGF0YV9jb3JyLCB0YXJnZXRfdmFyPVwic2NvcmVcIiwgY29scyA9IGMoXCJDb25kaXRpb25cIixcIklzX1NlbmVzY2VudFwiLFwicmFuZG9tX2NhdFwiLFwicmFuZG9tX251bWVyaWNcIiksXG4gICAgICAgICAgICAgICAgIGRpc2NyZXRlX2NvbG9ycyA9IGxpc3QoSXNfU2VuZXNjZW50PWMoXCJTZW5lc2NlbnRcIj1cInBpbmtcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vbiBTZW5lc2NlbnRcIj1cIm9yYW5nZVwiKSksIFxuICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNfY29sb3IgPSBcIiM4QzZEMDNcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfcGFsZXR0ZSA9IFwiU2V0MlwiLCBucm93PTEsIHNpemVhbm5vdD0zLCBsZWdlbmQucG9zaXRpb249XCJ0b3BcIilcblxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuVmFyaWFibGVBc3NvY2lhdGlvbihtZXRhZGF0YV9jb3JyLCB0YXJnZXRfdmFyPVwic2NvcmVcIiwgY29scyA9IGMoXCJDb25kaXRpb25cIixcIklzX1NlbmVzY2VudFwiLFwicmFuZG9tX2NhdFwiLFwicmFuZG9tX251bWVyaWNcIiksXG4gICAgICAgICAgICAgICAgIGRpc2NyZXRlX2NvbG9ycyA9IGxpc3QoSXNfU2VuZXNjZW50PWMoXCJTZW5lc2NlbnRcIj1cInBpbmtcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vbiBTZW5lc2NlbnRcIj1cIm9yYW5nZVwiKSksIFxuICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNfY29sb3IgPSBcIiM4QzZEMDNcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfcGFsZXR0ZSA9IFwiU2V0MlwiLCBucm93PTEsIHNpemVhbm5vdD0zLCBsZWdlbmQucG9zaXRpb249XCJ0b3BcIilcblxuYGBgIn0= -->

```r
VariableAssociation(metadata_corr, target_var="score", cols = c("Condition","Is_Senescent","random_cat","random_numeric"),
                 discrete_colors = list(Is_Senescent=c("Senescent"="pink",
                                                 "Non Senescent"="orange")), 
                continuous_color = "#8C6D03", 
                            color_palette = "Set2", nrow=1, sizeannot=3, legend.position="top")
`geom_smooth()` using formula = 'y ~ x'

Score_VariableAssociation(data=corrcounts_merge, metadata=metadata_merge_corr, cols = c("Condition","random_cat","random_numeric"), method="ranking", gene_set = list(HernandezSegura=bidirectsigs$HernandezSegura), mode = "extensive", nonsignif_color = "white", signif_color = "red", saturation_value=NULL,sig_threshold = 0.05, widthlabels=29, labsize=10, titlesize=14, pointSize=5)
Considering bidirectional gene signature mode for signature HernandezSegura
Warning in min(df_results_overall$padj) :
  no non-missing arguments to min; returning Inf
`geom_smooth()` using formula = 'y ~ x'

options(error=recover)
Score_VariableAssociation(data=corrcounts_merge, metadata=metadata_merge_corr, cols = c( "random_numeric"), method="ranking", gene_set = list(HernandezSegura=bidirectsigs$HernandezSegura), mode = "extensive", nonsignif_color = "white", signif_color = "red", saturation_value=NULL,sig_threshold = 0.05, widthlabels=29, labsize=10, titlesize=14, pointSize=5)
Considering bidirectional gene signature mode for signature HernandezSegura
Warning in min(df_results_overall$padj) :
  no non-missing arguments to min; returning Inf
`geom_smooth()` using formula = 'y ~ x'

Individual Genes

Violin Expression Plots



senescence_triggers_colors <- c(
  "none" = "#E57373",  # Soft red  
  "Radiation" = "#BDBDBD",  # Medium gray  
  "DNA damage" = "#64B5F6",  # Brighter blue  
  "Telomere shortening" = "#4FC3F7",  # Vivid sky blue  
  "DNA demethylation" = "#BA68C8",  # Rich lavender  
  "Oxidative stress" = "#FDD835",  # Strong yellow  
  "Conditioned Medium" = "#F2994A",  # Warm orange  
  "Oncogene" = "#81C784",  # Medium green  
  "Lipid Accumulation" = "#E57373",  # Coral  
  "Calcium influx" = "#26A69A",  # Deep teal  
  "Plasma membrane dysruption" = "#D32F2F",  # Strong salmon  
  "OSKM factors" = "#FFB74D",  # Bright peach  
  "YAP KO" = "#9575CD"  # Deep pastel purple  
)


IndividualGenes_Violins(data = corrcounts_merge, metadata = metadata_merge, genes = c("CDKN1A", "CDKN2A", "GLB1","TP53","CCL2"), GroupingVariable = "Condition", plot=T, ncol=NULL, nrow=2, divide="CellType", invert_divide=FALSE,ColorValues=senescence_triggers_colors, pointSize=2, ColorVariable="SenescentType", title="Senescence", widthTitle=16,y_limits = NULL,legend_nrow=4, xlab="Condition",colorlab="") 

Correlation Heatmap

options(error=recover)
CorrelationHeatmap(data=corrcounts_merge, 
                   metadata = metadata_merge, 
                   genes=c("CDKN1A", "CDKN2A", "GLB1","TP53","CCL2"), 
                   separate.by = "Condition", 
                   method = "pearson",  
                   colorlist = list(low = "#3F4193", mid = "#F9F4AE", high = "#B44141"),
                   limits_colorscale = c(-1,0,1), 
                   widthTitle = 16, 
                   title = "test", 
                   cluster_rows = TRUE, 
                   cluster_columns = TRUE,  
                   detailedresults = FALSE, 
                   legend_position="right",
                   titlesize=20)

Expression Heatmaps

options(error=recover)

annotation_colors <- list(
  CellType = c(
    "Fibroblast"   = "#FF6961",   # Strong Pastel Red  
    "Keratinocyte" = "#FFB347",   # Strong Pastel Orange  
    "Melanocyte"   = "#FFD700",   # Strong Pastel Yellow  
    "Endothelial"  = "#77DD77",   # Strong Pastel Green  
    "Neuronal"     = "#779ECB",   # Strong Pastel Blue  
    "Mesenchymal"  = "#C27BA0"    # Strong Pastel Purple  
  ),
  Condition = c(
    "Senescent"     = "#65AC7C",  # Example color: greenish
    "Proliferative" = "#5F90D4",  # Example color: blueish
    "Quiescent"     = "#EDA03E"   # Example color: orange
  )
)

ExpressionHeatmap(data=corrcounts_merge, 
                  metadata = metadata_merge, 
                  genes=c("CDKN1A", "CDKN2A", "GLB1","TP53","CCL2"),  
                  annotate.by = c("CellType","Condition"),
                  annotation_colors = annotation_colors,
                  colorlist = list(low = "#3F4193", mid = "#F9F4AE", high = "#B44141"),
                  cluster_rows = TRUE, 
                  cluster_columns = FALSE,
                  title = "test", 
                  titlesize = 20,
                  legend_position = "right",
                  scale_position="right")

ROC/AUC


cellTypes_colors <- c(
  "Fibroblast" = "#FF6961",   # Strong Pastel Red  
  "Keratinocyte" = "#FFB347", # Strong Pastel Orange  
  "Melanocyte" = "#FFD700",   # Strong Pastel Yellow  
  "Endothelial" = "#77DD77",  # Strong Pastel Green  
  "Neuronal" = "#779ECB",     # Strong Pastel Blue  
  "Mesenchymal" = "#C27BA0"   # Strong Pastel Purple  
)

ROCandAUCplot(corrcounts_merge, 
              metadata_merge, 
              condition_var = "Condition", 
              class = "Senescent", 
              genes=c("CDKN1A", "CDKN2A", "GLB1","TP53","CCL2"), 
              group_var="CellType",
              plot_type = "all",
              heatmap_params = list(col = list( "#F9F4AE" ,"#B44141"),
                                    limits = c(0.5,1),
                                    cluster_rows=T),
              roc_params = list(nrow=2,
                                ncol=2,
                                colors=cellTypes_colors),
              commomplot_params = list(widths=c(0.5,0.5)))

Cohen’s d

CohenDHeatmap(corrcounts_merge, 
              metadata_merge, 
              genes=c("CDKN1A", "CDKN2A", "GLB1","TP53","CCL2"),
              condition_var = "Condition", 
              class = "Senescent", 
              group_var = "CellType",
              title = NULL,
              widthTitle = 16,
              heatmap_params = list(col = list( "#F9F4AE" ,"#B44141"),
                                    limits = NULL,
                                    cluster_rows=T))

PCA with genes from signature only


CellTypecols = c(
  "Fibroblast"   = "#FF6961",   # Strong Pastel Red  
  "Keratinocyte" = "#FFB347",   # Strong Pastel Orange  
  "Melanocyte"   = "#FFD700",   # Strong Pastel Yellow  
  "Endothelial"  = "#77DD77",   # Strong Pastel Green  
  "Neuronal"     = "#779ECB",   # Strong Pastel Blue  
  "Mesenchymal"  = "#C27BA0"    # Strong Pastel Purple  
)

sencols <- c(
  "Senescent" = "#D32F2F",  # Strong salmon  
  "Quiescent" = "#FFB74D",  # Bright peach  
  "Proliferative" = "#9575CD"  # Deep pastel purple  
)

plotPCA(data=corrcounts_merge, 
        metadata=metadata_merge, 
        genes=c("CDKN1A", "CDKN2A", "GLB1","TP53","CCL2"), 
        scale=FALSE, 
        center=TRUE, 
        PCs=list(c(1,2), c(2,3), c(3,4)), 
        ColorVariable="Condition",
        ColorValues=sencols,
        pointSize=5,
        legend_nrow=1, 
        ncol=3, 
        nrow=NULL)

Enrichment-based

GSEA

options(error=recover)
degenes <- calculateDE(data=corrcounts_merge, 
                       metadata=metadata_merge, 
                       variables="Condition", 
                       lmexpression = NULL, 
                       modelmat = NULL, 
                       contrasts = c("Senescent - Proliferative",
                                     "Senescent - Quiescent",
                                     "Proliferative - Quiescent")) 

degenes
$`Senescent-Proliferative`

$`Senescent-Quiescent`

$`Proliferative-Quiescent`
NA
options(error=recover)
plotVolcano(DEResultsList=degenes, genes=bidirectsigs, N=NULL, x="logFC",y="-log10(adj.P.Val)", pointSize=2, color="pink", highlightcolor="darkblue", highlightcolor_upreg = "#038C65", highlightcolor_downreg = "#8C0303", nointerestcolor="grey",threshold_y=NULL, threshold_x=NULL, xlab=NULL, ylab=NULL, ncol=NULL, nrow=NULL, title=NULL,labsize=7,widthlabs=25, invert=T)

options(error=recover)
GSEAresults <- runGSEA(degenes, bidirectsigs, stat = NULL)
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in fgseaMultilevel(pathways = pathways, stats = stats, minSize = minSize,  :
  For some of the pathways the P-values were likely overestimated. For such pathways log2err is set to NA.
Warning in fgseaMultilevel(pathways = pathways, stats = stats, minSize = minSize,  :
  For some pathways, in reality P-values are less than 1e-50. You can set the `eps` argument to zero for better estimation.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in fgseaMultilevel(pathways = pathways, stats = stats, minSize = minSize,  :
  For some of the pathways the P-values were likely overestimated. For such pathways log2err is set to NA.
Warning in fgseaMultilevel(pathways = pathways, stats = stats, minSize = minSize,  :
  For some pathways, in reality P-values are less than 1e-50. You can set the `eps` argument to zero for better estimation.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
GSEAresults
$`Senescent-Proliferative`

$`Senescent-Quiescent`

$`Proliferative-Quiescent`
NA
plotGSEAenrichment(GSEA_results=GSEAresults, DEGList=degenes, gene_sets=bidirectsigs, widthTitle=32,grid = T, titlesize = 10, nrow=3, ncol=9) 

options(error=recover)
plotNESlollipop(GSEA_results=GSEAresults, sig_threshold = 0.05,saturation_value=0.00001, nonsignif_color = "white", signif_color = "red",
                grid = T, nrow = 1, ncol = NULL, widthlabels=28, title=NULL)

plotCombinedGSEA(GSEAresults, sig_threshold = 0.05, PointSize=9, widthlegend = 26 )

Association with Phenotype

If the user is investigating if a certain variable can be described from the GSEA results, and not already knowing that variable. More exploratory…

  • For each variable, define all possible contrasts (e.g. if A,B,C, then consider A-B, A-C, B-C,A-(B+C)/2, etc…)

  • Use calculateDE without baseline and all possible contrasts

  • perform GSEA and collect all results in only one table

  • Plot all results in lollipop plots, y axis with all contrasts

  • One function to calculate all results; one to do the lollypop plot

 options(error=recover)
df_test <- GSEA_VariableAssociation(data=corrcounts_merge, 
                         metadata=metadata_merge_corr, 
                         cols=c("Condition","Is_Senescent","random_cat","random_numeric"), 
                         mode="extensive", 
                         gene_set=list(HernandezSegura=bidirectsigs$HernandezSegura),  saturation_value=0.000000001, nonsignif_color = "white", signif_color = "red",
                         sig_threshold = 0.05, widthlabels=30, labsize=10, titlesize=14) 
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
df_test$plot

metadata_corr_1 <- CalculateScores(data = corrcounts_merge, metadata = metadata_merge_corr, method = "ssGSEA", gene_sets = list(HernandezSegura=bidirectsigs$HernandezSegura) )
Considering bidirectional gene signature mode for signature HernandezSegura
No id variables; using all as measure variables
No id variables; using all as measure variables
metadata_corr <- metadata_corr_1$`HernandezSegura`
metadata_corr
VariableAssociation(df=metadata_corr, cols=c("Condition","Is_Senescent","random_cat","random_numeric"), 
                    target_var="score", targetvar_lab="Score",
                    discrete_colors = list(Is_Senescent=c("Senescent"="pink",
                                                          "Non Senescent"="orange")), 
                    continuous_color = "#8C6D03",
                    color_palette = "Set2",
                    sizeannot=3, ncol=1, nrow=4,
                    numeric = "pearson",
                    categorical_bin = "t.test",
                    categorical_multi = "anova", title=NULL, titlesize=14,
                    nonsignif_color = "white", signif_color = "red", 
                    saturation_value=NULL,sig_threshold = 0.05, widthlabels=14, pointSize=5, heights=c(0.3,0.2,0.3,0.2)) 
`geom_smooth()` using formula = 'y ~ x'

 options(error=recover)
df_test <- GSEA_VariableAssociation(data=corrcounts_merge, 
                         metadata=metadata_merge_corr, 
                         cols=c("Condition" ), 
                         mode="medium", 
                         gene_set=list(HernandezSegura_UP=SenescenceSignatures$`[UP]_HernandezSegura` ), 
                        saturation_value=0.000000001, nonsignif_color = "white", signif_color = "red",
                         sig_threshold = 0.05, widthlabels=30, labsize=10, titlesize=14) 
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
df_test$plot


df_test <- GSEA_VariableAssociation(data=corrcounts_merge, 
                         metadata=metadata_merge_corr, 
                         cols=c("Condition" ), 
                         mode="medium", 
                         gene_set=list( HernandezSegura_Bidirect_UP=subset(bidirectsigs$HernandezSegura, enrichment==1)), 
                         saturation_value=0.000000001, nonsignif_color = "white", signif_color = "red",
                         sig_threshold = 0.05, widthlabels=30, labsize=10, titlesize=14) 
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam,  :
  There are ties in the preranked stats (0.03% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
df_test$plot

NA
NA
LS0tCnRpdGxlOiAiRGVidWdnaW5nIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIEltcG9ydCBEYXRhCgpgYGB7cn0KY29ycmNvdW50c19tZXJnZSA8LSByZWFkUkRTKCJ+L1ZlcnNpb25Db250cm9sL3NlbmVzY2VuY2VfYmVuY2htYXJraW5nL0RhdGEvY29ycmNvdW50c19tZXJnZS5yZHMiKQptZXRhZGF0YV9tZXJnZSA8LSByZWFkUkRTKCJ+L1ZlcnNpb25Db250cm9sL3NlbmVzY2VuY2VfYmVuY2htYXJraW5nL0RhdGEvbWV0YWRhdGFfbWVyZ2UucmRzIikKU2VuZXNjZW5jZVNpZ25hdHVyZXMgPC0gcmVhZFJEUygifi9WZXJzaW9uQ29udHJvbC9zZW5lc2NlbmNlX2JlbmNobWFya2luZy9Db21tb25GaWxlcy9TZW5lc2NlbmNlU2lnbmF0dXJlc19kaXZpZGVkX25ld0NlbGxBZ2UuUkRTIikKYGBgCgpgYGB7cn0Kc2V0LnNlZWQoIjEyMzQ1NiIpCm1ldGFkYXRhX21lcmdlX2NvcnIgPC0gbWV0YWRhdGFfbWVyZ2UKbWV0YWRhdGFfbWVyZ2VfY29yciRyYW5kb21fY2F0IDwtICBzYW1wbGUoYygiQSIsIkIiLCJDIiksIG5yb3cobWV0YWRhdGFfbWVyZ2VfY29yciksIHJlcGxhY2UgPSBUKQptZXRhZGF0YV9tZXJnZV9jb3JyJHJhbmRvbV9udW1lcmljIDwtIHNhbXBsZSgwOjEwMCwgbnJvdyhtZXRhZGF0YV9tZXJnZV9jb3JyKSwgcmVwbGFjZSA9IFRSVUUpCm1ldGFkYXRhX21lcmdlX2NvcnIkSXNfU2VuZXNjZW50IDwtIGlmZWxzZShtZXRhZGF0YV9tZXJnZV9jb3JyJENvbmRpdGlvbiA9PSAiU2VuZXNjZW50IiwgIlNlbmVzY2VudCIsICJOb24gU2VuZXNjZW50IikKCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KG1hcmtlUikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShlZGdlUikKbGlicmFyeShlZmZlY3RzaXplKSAgIyBGb3IgZXRhX3NxdWFyZWQgYW5kIENvaGVuJ3MgZiBjYWxjdWxhdGlvbgo/bWFya2VSCmBgYAoKIyBTY29yZXMgCgpgYGB7cn0KP0NhbGN1bGF0ZVNjb3JlcwpgYGAKCiMjIFVuaWRpcmVjdGlvbmFsCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQpkZl9zc0dTRUEgPC0gQ2FsY3VsYXRlU2NvcmVzKGRhdGEgPSBjb3JyY291bnRzX21lcmdlLCBtZXRhZGF0YSA9IG1ldGFkYXRhX21lcmdlLCBtZXRob2QgPSAic3NHU0VBIiwgZ2VuZV9zZXRzID0gU2VuZXNjZW5jZVNpZ25hdHVyZXMpCgpzZW5lc2NlbmNlX3RyaWdnZXJzX2NvbG9ycyA8LSBjKAogICJub25lIiA9ICIjRTU3MzczIiwgICMgU29mdCByZWQgIAogICJSYWRpYXRpb24iID0gIiNCREJEQkQiLCAgIyBNZWRpdW0gZ3JheSAgCiAgIkROQSBkYW1hZ2UiID0gIiM2NEI1RjYiLCAgIyBCcmlnaHRlciBibHVlICAKICAiVGVsb21lcmUgc2hvcnRlbmluZyIgPSAiIzRGQzNGNyIsICAjIFZpdmlkIHNreSBibHVlICAKICAiRE5BIGRlbWV0aHlsYXRpb24iID0gIiNCQTY4QzgiLCAgIyBSaWNoIGxhdmVuZGVyICAKICAiT3hpZGF0aXZlIHN0cmVzcyIgPSAiI0ZERDgzNSIsICAjIFN0cm9uZyB5ZWxsb3cgIAogICJDb25kaXRpb25lZCBNZWRpdW0iID0gIiNGMjk5NEEiLCAgIyBXYXJtIG9yYW5nZSAgCiAgIk9uY29nZW5lIiA9ICIjODFDNzg0IiwgICMgTWVkaXVtIGdyZWVuICAKICAiTGlwaWQgQWNjdW11bGF0aW9uIiA9ICIjRTU3MzczIiwgICMgQ29yYWwgIAogICJDYWxjaXVtIGluZmx1eCIgPSAiIzI2QTY5QSIsICAjIERlZXAgdGVhbCAgCiAgIlBsYXNtYSBtZW1icmFuZSBkeXNydXB0aW9uIiA9ICIjRDMyRjJGIiwgICMgU3Ryb25nIHNhbG1vbiAgCiAgIk9TS00gZmFjdG9ycyIgPSAiI0ZGQjc0RCIsICAjIEJyaWdodCBwZWFjaCAgCiAgIllBUCBLTyIgPSAiIzk1NzVDRCIgICMgRGVlcCBwYXN0ZWwgcHVycGxlICAKKQoKY2VsbFR5cGVzX2NvbG9ycyA8LSBjKAogICJGaWJyb2JsYXN0IiA9ICIjRkY2OTYxIiwgICAjIFN0cm9uZyBQYXN0ZWwgUmVkICAKICAiS2VyYXRpbm9jeXRlIiA9ICIjRkZCMzQ3IiwgIyBTdHJvbmcgUGFzdGVsIE9yYW5nZSAgCiAgIk1lbGFub2N5dGUiID0gIiNGRkQ3MDAiLCAgICMgU3Ryb25nIFBhc3RlbCBZZWxsb3cgIAogICJFbmRvdGhlbGlhbCIgPSAiIzc3REQ3NyIsICAjIFN0cm9uZyBQYXN0ZWwgR3JlZW4gIAogICJOZXVyb25hbCIgPSAiIzc3OUVDQiIsICAgICAjIFN0cm9uZyBQYXN0ZWwgQmx1ZSAgCiAgIk1lc2VuY2h5bWFsIiA9ICIjQzI3QkEwIiAgICMgU3Ryb25nIFBhc3RlbCBQdXJwbGUgIAopCgpjb25kX2NvaGVuZCA8LSBsaXN0KEE9YygiU2VuZXNjZW50IiksICMgaWYgbm8gdmFyaWFibGUgaXMgZGVmaW5lZCwgd2lsbCBiZSB0aGUgZmlyc3QgdGhhdCBhcHBlYXJzIGluIHRoZSBnZ3Bsb3QKICAgICAgICAgICAgICAgICAgICBCPWMoIlByb2xpZmVyYXRpdmUiLCJRdWllc2NlbnQiKSkKClBsb3RTY29yZXMoUmVzdWx0c0xpc3QgPSBkZl9zc0dTRUEsIENvbG9yVmFyaWFibGUgPSAiQ2VsbFR5cGUiLCBHcm91cGluZ1ZhcmlhYmxlPSJDb25kaXRpb24iLCAgbWV0aG9kID0ic3NHU0VBIiwgQ29sb3JWYWx1ZXMgPSBjZWxsVHlwZXNfY29sb3JzLCBDb25uZWN0R3JvdXBzPVRSVUUsIG5jb2wgPSA2LCBucm93ID0gMiwgd2lkdGhUaXRsZT0yMCwgeV9saW1pdHMgPSBOVUxMLCBsZWdlbmRfbnJvdyA9IDIsY29uZF9jb2hlbmQ9Y29uZF9jb2hlbmQpCgpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQpkZl9sb2dtZWRpYW4gPC0gQ2FsY3VsYXRlU2NvcmVzKGRhdGEgPSBjb3JyY291bnRzX21lcmdlLCBtZXRhZGF0YSA9IG1ldGFkYXRhX21lcmdlLCBtZXRob2QgPSAibG9nbWVkaWFuIiwgZ2VuZV9zZXRzID0gU2VuZXNjZW5jZVNpZ25hdHVyZXMpCgpzZW5lc2NlbmNlX3RyaWdnZXJzX2NvbG9ycyA8LSBjKAogICJub25lIiA9ICIjRTU3MzczIiwgICMgU29mdCByZWQgIAogICJSYWRpYXRpb24iID0gIiNCREJEQkQiLCAgIyBNZWRpdW0gZ3JheSAgCiAgIkROQSBkYW1hZ2UiID0gIiM2NEI1RjYiLCAgIyBCcmlnaHRlciBibHVlICAKICAiVGVsb21lcmUgc2hvcnRlbmluZyIgPSAiIzRGQzNGNyIsICAjIFZpdmlkIHNreSBibHVlICAKICAiRE5BIGRlbWV0aHlsYXRpb24iID0gIiNCQTY4QzgiLCAgIyBSaWNoIGxhdmVuZGVyICAKICAiT3hpZGF0aXZlIHN0cmVzcyIgPSAiI0ZERDgzNSIsICAjIFN0cm9uZyB5ZWxsb3cgIAogICJDb25kaXRpb25lZCBNZWRpdW0iID0gIiNGMjk5NEEiLCAgIyBXYXJtIG9yYW5nZSAgCiAgIk9uY29nZW5lIiA9ICIjODFDNzg0IiwgICMgTWVkaXVtIGdyZWVuICAKICAiTGlwaWQgQWNjdW11bGF0aW9uIiA9ICIjRTU3MzczIiwgICMgQ29yYWwgIAogICJDYWxjaXVtIGluZmx1eCIgPSAiIzI2QTY5QSIsICAjIERlZXAgdGVhbCAgCiAgIlBsYXNtYSBtZW1icmFuZSBkeXNydXB0aW9uIiA9ICIjRDMyRjJGIiwgICMgU3Ryb25nIHNhbG1vbiAgCiAgIk9TS00gZmFjdG9ycyIgPSAiI0ZGQjc0RCIsICAjIEJyaWdodCBwZWFjaCAgCiAgIllBUCBLTyIgPSAiIzk1NzVDRCIgICMgRGVlcCBwYXN0ZWwgcHVycGxlICAKKQoKY2VsbFR5cGVzX2NvbG9ycyA8LSBjKAogICJGaWJyb2JsYXN0IiA9ICIjRkY2OTYxIiwgICAjIFN0cm9uZyBQYXN0ZWwgUmVkICAKICAiS2VyYXRpbm9jeXRlIiA9ICIjRkZCMzQ3IiwgIyBTdHJvbmcgUGFzdGVsIE9yYW5nZSAgCiAgIk1lbGFub2N5dGUiID0gIiNGRkQ3MDAiLCAgICMgU3Ryb25nIFBhc3RlbCBZZWxsb3cgIAogICJFbmRvdGhlbGlhbCIgPSAiIzc3REQ3NyIsICAjIFN0cm9uZyBQYXN0ZWwgR3JlZW4gIAogICJOZXVyb25hbCIgPSAiIzc3OUVDQiIsICAgICAjIFN0cm9uZyBQYXN0ZWwgQmx1ZSAgCiAgIk1lc2VuY2h5bWFsIiA9ICIjQzI3QkEwIiAgICMgU3Ryb25nIFBhc3RlbCBQdXJwbGUgIAopCgpjb25kX2NvaGVuZCA8LSBsaXN0KEE9YygiU2VuZXNjZW50IiksICMgaWYgbm8gdmFyaWFibGUgaXMgZGVmaW5lZCwgd2lsbCBiZSB0aGUgZmlyc3QgdGhhdCBhcHBlYXJzIGluIHRoZSBnZ3Bsb3QKICAgICAgICAgICAgICAgICAgICBCPWMoIlByb2xpZmVyYXRpdmUiLCJRdWllc2NlbnQiKSkKClBsb3RTY29yZXMoUmVzdWx0c0xpc3QgPSBkZl9sb2dtZWRpYW4sIENvbG9yVmFyaWFibGUgPSAiQ2VsbFR5cGUiLCBHcm91cGluZ1ZhcmlhYmxlPSJDb25kaXRpb24iLCAgbWV0aG9kID0ibG9nbWVkaWFuIiwgQ29sb3JWYWx1ZXMgPSBjZWxsVHlwZXNfY29sb3JzLCBDb25uZWN0R3JvdXBzPVRSVUUsIG5jb2wgPSA2LCBucm93ID0gMiwgd2lkdGhUaXRsZT0yMCwgeV9saW1pdHMgPSBOVUxMLCBsZWdlbmRfbnJvdyA9IDIseGxhYj1OVUxMLCBjb25kX2NvaGVuZCA9IGNvbmRfY29oZW5kKQoKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0KZGZfcmFua2luZyA8LSBDYWxjdWxhdGVTY29yZXMoZGF0YSA9IGNvcnJjb3VudHNfbWVyZ2UsIG1ldGFkYXRhID0gbWV0YWRhdGFfbWVyZ2UsIG1ldGhvZCA9ICJyYW5raW5nIiwgZ2VuZV9zZXRzID0gU2VuZXNjZW5jZVNpZ25hdHVyZXMpCgpzZW5lc2NlbmNlX3RyaWdnZXJzX2NvbG9ycyA8LSBjKAogICJub25lIiA9ICIjRTU3MzczIiwgICMgU29mdCByZWQgIAogICJSYWRpYXRpb24iID0gIiNCREJEQkQiLCAgIyBNZWRpdW0gZ3JheSAgCiAgIkROQSBkYW1hZ2UiID0gIiM2NEI1RjYiLCAgIyBCcmlnaHRlciBibHVlICAKICAiVGVsb21lcmUgc2hvcnRlbmluZyIgPSAiIzRGQzNGNyIsICAjIFZpdmlkIHNreSBibHVlICAKICAiRE5BIGRlbWV0aHlsYXRpb24iID0gIiNCQTY4QzgiLCAgIyBSaWNoIGxhdmVuZGVyICAKICAiT3hpZGF0aXZlIHN0cmVzcyIgPSAiI0ZERDgzNSIsICAjIFN0cm9uZyB5ZWxsb3cgIAogICJDb25kaXRpb25lZCBNZWRpdW0iID0gIiNGMjk5NEEiLCAgIyBXYXJtIG9yYW5nZSAgCiAgIk9uY29nZW5lIiA9ICIjODFDNzg0IiwgICMgTWVkaXVtIGdyZWVuICAKICAiTGlwaWQgQWNjdW11bGF0aW9uIiA9ICIjRTU3MzczIiwgICMgQ29yYWwgIAogICJDYWxjaXVtIGluZmx1eCIgPSAiIzI2QTY5QSIsICAjIERlZXAgdGVhbCAgCiAgIlBsYXNtYSBtZW1icmFuZSBkeXNydXB0aW9uIiA9ICIjRDMyRjJGIiwgICMgU3Ryb25nIHNhbG1vbiAgCiAgIk9TS00gZmFjdG9ycyIgPSAiI0ZGQjc0RCIsICAjIEJyaWdodCBwZWFjaCAgCiAgIllBUCBLTyIgPSAiIzk1NzVDRCIgICMgRGVlcCBwYXN0ZWwgcHVycGxlICAKKQoKY2VsbFR5cGVzX2NvbG9ycyA8LSBjKAogICJGaWJyb2JsYXN0IiA9ICIjRkY2OTYxIiwgICAjIFN0cm9uZyBQYXN0ZWwgUmVkICAKICAiS2VyYXRpbm9jeXRlIiA9ICIjRkZCMzQ3IiwgIyBTdHJvbmcgUGFzdGVsIE9yYW5nZSAgCiAgIk1lbGFub2N5dGUiID0gIiNGRkQ3MDAiLCAgICMgU3Ryb25nIFBhc3RlbCBZZWxsb3cgIAogICJFbmRvdGhlbGlhbCIgPSAiIzc3REQ3NyIsICAjIFN0cm9uZyBQYXN0ZWwgR3JlZW4gIAogICJOZXVyb25hbCIgPSAiIzc3OUVDQiIsICAgICAjIFN0cm9uZyBQYXN0ZWwgQmx1ZSAgCiAgIk1lc2VuY2h5bWFsIiA9ICIjQzI3QkEwIiAgICMgU3Ryb25nIFBhc3RlbCBQdXJwbGUgIAopCgpjb25kX2NvaGVuZCA8LSBsaXN0KEE9YygiU2VuZXNjZW50IiksICMgaWYgbm8gdmFyaWFibGUgaXMgZGVmaW5lZCwgd2lsbCBiZSB0aGUgZmlyc3QgdGhhdCBhcHBlYXJzIGluIHRoZSBnZ3Bsb3QKICAgICAgICAgICAgICAgICAgICBCPWMoIlByb2xpZmVyYXRpdmUiLCJRdWllc2NlbnQiKSkKClBsb3RTY29yZXMoUmVzdWx0c0xpc3QgPSBkZl9yYW5raW5nLCBDb2xvclZhcmlhYmxlID0gIkNlbGxUeXBlIiwgR3JvdXBpbmdWYXJpYWJsZT0iQ29uZGl0aW9uIiwgIG1ldGhvZCA9InJhbmtpbmciLCBDb2xvclZhbHVlcyA9IGNlbGxUeXBlc19jb2xvcnMsIENvbm5lY3RHcm91cHM9VFJVRSwgbmNvbCA9IDYsIG5yb3cgPSAyLCB3aWR0aFRpdGxlPTIwLCB5X2xpbWl0cyA9IE5VTEwsIGxlZ2VuZF9ucm93ID0gMix4bGFiPU5VTEwsIGNvbmRfY29oZW5kID0gY29uZF9jb2hlbmQpCgpgYGAKCgoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9CgpwbG90bGlzdCA8LSBsaXN0KCkKCmZvciAoc2lnIGluIG5hbWVzKGRmX3NzR1NFQSkpewogIAogIGRmX3N1YnNldF9zc0dTRUEgPC0gZGZfc3NHU0VBW1tzaWddXQogIGRmX3N1YnNldF9sb2dtZWRpYW4gPC0gZGZfbG9nbWVkaWFuW1tzaWddXQogIAogIGRmX3N1YnNldF9tZXJnZSA8LSBtZXJnZShkZl9zdWJzZXRfc3NHU0VBLGRmX3N1YnNldF9sb2dtZWRpYW4sYnk9InNhbXBsZSIpCiAgCiAgIyBXcmFwIHRoZSBzaWduYXR1cmUgbmFtZSB1c2luZyB0aGUgaGVscGVyIGZ1bmN0aW9uCiAgd3JhcHBlZF90aXRsZSA8LSB3cmFwX3RpdGxlX2F1eChzaWcsIHdpZHRoID0gMjApICAKICAKICBwbG90bGlzdFtbc2lnXV0gPC0gZ2dwbG90Mjo6Z2dwbG90KGRmX3N1YnNldF9tZXJnZSwgYWVzKHg9c2NvcmUueCwgeT1zY29yZS55KSkgKwogICAgZ2VvbV9wb2ludChzaXplPTQsIGFscGhhPTAuOCwgZmlsbD0iZGFya2dyZXkiLCBzaGFwZT0yMSkgKwogICAgdGhlbWVfYncoKSArCiAgICB4bGFiKCJzc0dTRUEgRW5yaWNobWVudCBTY29yZSIpICsKICAgIHlsYWIoIk5vcm1hbGlzZWQgU2lnbmF0dXJlIFNjb3JlIikgKwogICAgZ2d0aXRsZSh3cmFwcGVkX3RpdGxlKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTEwKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSAKICAKfQoKZ2dwdWJyOjpnZ2FycmFuZ2UocGxvdGxpc3Q9cGxvdGxpc3QsIG5yb3c9MywgbmNvbD00LCBhbGlnbiA9ICJoIikKYGBgCgojIyBCaWRpcmVjdGlvbmFsIGdlbmUgc2lnbmF0dXJlcwoKVHJ5IHNjb3JlcyB3aXRoIGJpZGlyZWN0aW9uYWwgc2lnbmF0dXJlcwoKYGBge3J9CmJpZGlyZWN0c2lncyA8LSByZWFkUkRTKCJ+L1ZlcnNpb25Db250cm9sL3NlbmVzY2VuY2VfYmVuY2htYXJraW5nL0NvbW1vbkZpbGVzL1NlbmVzY2VuY2VTaWduYXR1cmVzX2NvbXBsZXRlX25ld0NlbGxBZ2UuUkRTIikKZm9yIChzaWcgaW4gbmFtZXMoYmlkaXJlY3RzaWdzKSl7CiAgc2lnZGYgPC0gYmlkaXJlY3RzaWdzW1tzaWddXQogIHNpZ2RmIDwtIHNpZ2RmWywxOjJdICMgcmVtb3ZlIHRoZSB0aGlyZCBjb2x1bW4sIGlmIGFwcGxpY2FibGUKICBpZihhbnkoc2lnZGZbLDJdPT0ibm90X3JlcG9ydGVkIikpewogICAgc2lnZGYgPC0gc2lnZGZbLDFdCiAgICBiaWRpcmVjdHNpZ3NbW3NpZ11dIDwtIHNpZ2RmCiAgICBuZXh0IAogIH0KICBzaWdkZlssMl0gPC0gaWZlbHNlKHNpZ2RmWywyXT09ImVucmljaGVkIiwxLC0xKQogIGJpZGlyZWN0c2lnc1tbc2lnXV0gPC0gc2lnZGYKfQpiaWRpcmVjdHNpZ3MKCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9MTB9CmRmX2xvZ21lZGlhbiA8LSBDYWxjdWxhdGVTY29yZXMoZGF0YSA9IGNvcnJjb3VudHNfbWVyZ2UsIG1ldGFkYXRhID0gbWV0YWRhdGFfbWVyZ2UsIG1ldGhvZCA9ICJsb2dtZWRpYW4iLCBnZW5lX3NldHMgPSBiaWRpcmVjdHNpZ3MpCgpzZW5lc2NlbmNlX3RyaWdnZXJzX2NvbG9ycyA8LSBjKAogICJub25lIiA9ICIjRTU3MzczIiwgICMgU29mdCByZWQgIAogICJSYWRpYXRpb24iID0gIiNCREJEQkQiLCAgIyBNZWRpdW0gZ3JheSAgCiAgIkROQSBkYW1hZ2UiID0gIiM2NEI1RjYiLCAgIyBCcmlnaHRlciBibHVlICAKICAiVGVsb21lcmUgc2hvcnRlbmluZyIgPSAiIzRGQzNGNyIsICAjIFZpdmlkIHNreSBibHVlICAKICAiRE5BIGRlbWV0aHlsYXRpb24iID0gIiNCQTY4QzgiLCAgIyBSaWNoIGxhdmVuZGVyICAKICAiT3hpZGF0aXZlIHN0cmVzcyIgPSAiI0ZERDgzNSIsICAjIFN0cm9uZyB5ZWxsb3cgIAogICJDb25kaXRpb25lZCBNZWRpdW0iID0gIiNGMjk5NEEiLCAgIyBXYXJtIG9yYW5nZSAgCiAgIk9uY29nZW5lIiA9ICIjODFDNzg0IiwgICMgTWVkaXVtIGdyZWVuICAKICAiTGlwaWQgQWNjdW11bGF0aW9uIiA9ICIjRTU3MzczIiwgICMgQ29yYWwgIAogICJDYWxjaXVtIGluZmx1eCIgPSAiIzI2QTY5QSIsICAjIERlZXAgdGVhbCAgCiAgIlBsYXNtYSBtZW1icmFuZSBkeXNydXB0aW9uIiA9ICIjRDMyRjJGIiwgICMgU3Ryb25nIHNhbG1vbiAgCiAgIk9TS00gZmFjdG9ycyIgPSAiI0ZGQjc0RCIsICAjIEJyaWdodCBwZWFjaCAgCiAgIllBUCBLTyIgPSAiIzk1NzVDRCIgICMgRGVlcCBwYXN0ZWwgcHVycGxlICAKKQoKY2VsbFR5cGVzX2NvbG9ycyA8LSBjKAogICJGaWJyb2JsYXN0IiA9ICIjRkY2OTYxIiwgICAjIFN0cm9uZyBQYXN0ZWwgUmVkICAKICAiS2VyYXRpbm9jeXRlIiA9ICIjRkZCMzQ3IiwgIyBTdHJvbmcgUGFzdGVsIE9yYW5nZSAgCiAgIk1lbGFub2N5dGUiID0gIiNGRkQ3MDAiLCAgICMgU3Ryb25nIFBhc3RlbCBZZWxsb3cgIAogICJFbmRvdGhlbGlhbCIgPSAiIzc3REQ3NyIsICAjIFN0cm9uZyBQYXN0ZWwgR3JlZW4gIAogICJOZXVyb25hbCIgPSAiIzc3OUVDQiIsICAgICAjIFN0cm9uZyBQYXN0ZWwgQmx1ZSAgCiAgIk1lc2VuY2h5bWFsIiA9ICIjQzI3QkEwIiAgICMgU3Ryb25nIFBhc3RlbCBQdXJwbGUgIAopCgpjb25kX2NvaGVuZCA8LSBsaXN0KEE9YygiU2VuZXNjZW50IiksCiAgICAgICAgICAgICAgICAgICAgQj1jKCJQcm9saWZlcmF0aXZlIiwiUXVpZXNjZW50IikKICAgICAgICAgICAgICAgICAgICApICMgaWYgbm8gdmFyaWFibGUgaXMgZGVmaW5lZCwgd2lsbCBiZSB0aGUgZmlyc3QgdGhhdCBhcHBlYXJzIGluIHRoZSBnZ3Bsb3QgCgpvcHRpb25zKGVycm9yPXJlY292ZXIpClBsb3RTY29yZXMoZGF0YSA9IGNvcnJjb3VudHNfbWVyZ2UsIG1ldGFkYXRhID0gbWV0YWRhdGFfbWVyZ2UsIG1ldGhvZCA9ICJsb2dtZWRpYW4iLCBnZW5lX3NldHMgPSBiaWRpcmVjdHNpZ3MsICBDb2xvclZhcmlhYmxlID0gIkNlbGxUeXBlIiwgR3JvdXBpbmdWYXJpYWJsZT0iQ29uZGl0aW9uIiwgICBDb2xvclZhbHVlcyA9IGNlbGxUeXBlc19jb2xvcnMsIENvbm5lY3RHcm91cHM9VFJVRSwgbmNvbCA9IDMsIG5yb3cgPSAzLCB3aWR0aFRpdGxlPTIwLCBsaW1pdHMgPSBOVUxMLCBsZWdlbmRfbnJvdyA9IDIseGxhYj1OVUxMLCBjb25kX2NvaGVuZCA9IGNvbmRfY29oZW5kLCBjb21wdXRlX2NvaGVuPVQpCgpgYGAKCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0xMH0Kb3B0aW9ucyhlcnJvcj1yZWNvdmVyKQpQbG90U2NvcmVzKGRhdGEgPSBjb3JyY291bnRzX21lcmdlLCBtZXRhZGF0YSA9IG1ldGFkYXRhX21lcmdlLCBtZXRob2QgPSAibG9nbWVkaWFuIiwgZ2VuZV9zZXRzID0gYmlkaXJlY3RzaWdzLCAgQ29sb3JWYXJpYWJsZSA9ICJDZWxsVHlwZSIsIEdyb3VwaW5nVmFyaWFibGU9IkNvbmRpdGlvbiIsICAgQ29sb3JWYWx1ZXMgPSBjZWxsVHlwZXNfY29sb3JzLCBDb25uZWN0R3JvdXBzPVRSVUUsIG5jb2wgPSAzLCBucm93ID0gMywgd2lkdGhUaXRsZT0yMCwgbGltaXRzID0gTlVMTCwgbGVnZW5kX25yb3cgPSAyLHhsYWI9TlVMTCwgY29uZF9jb2hlbmQgPSBOVUxMLCBjb21wdXRlX2NvaGVuPVQsIHB2YWxjYWxjID0gRikKCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9MTB9CgpkZl9zc2dzZWEgPC0gQ2FsY3VsYXRlU2NvcmVzKGRhdGEgPSBjb3JyY291bnRzX21lcmdlLCBtZXRhZGF0YSA9IG1ldGFkYXRhX21lcmdlLCBtZXRob2QgPSAic3NHU0VBIiwgZ2VuZV9zZXRzID0gYmlkaXJlY3RzaWdzKQoKc2VuZXNjZW5jZV90cmlnZ2Vyc19jb2xvcnMgPC0gYygKICAibm9uZSIgPSAiI0U1NzM3MyIsICAjIFNvZnQgcmVkICAKICAiUmFkaWF0aW9uIiA9ICIjQkRCREJEIiwgICMgTWVkaXVtIGdyYXkgIAogICJETkEgZGFtYWdlIiA9ICIjNjRCNUY2IiwgICMgQnJpZ2h0ZXIgYmx1ZSAgCiAgIlRlbG9tZXJlIHNob3J0ZW5pbmciID0gIiM0RkMzRjciLCAgIyBWaXZpZCBza3kgYmx1ZSAgCiAgIkROQSBkZW1ldGh5bGF0aW9uIiA9ICIjQkE2OEM4IiwgICMgUmljaCBsYXZlbmRlciAgCiAgIk94aWRhdGl2ZSBzdHJlc3MiID0gIiNGREQ4MzUiLCAgIyBTdHJvbmcgeWVsbG93ICAKICAiQ29uZGl0aW9uZWQgTWVkaXVtIiA9ICIjRjI5OTRBIiwgICMgV2FybSBvcmFuZ2UgIAogICJPbmNvZ2VuZSIgPSAiIzgxQzc4NCIsICAjIE1lZGl1bSBncmVlbiAgCiAgIkxpcGlkIEFjY3VtdWxhdGlvbiIgPSAiI0U1NzM3MyIsICAjIENvcmFsICAKICAiQ2FsY2l1bSBpbmZsdXgiID0gIiMyNkE2OUEiLCAgIyBEZWVwIHRlYWwgIAogICJQbGFzbWEgbWVtYnJhbmUgZHlzcnVwdGlvbiIgPSAiI0QzMkYyRiIsICAjIFN0cm9uZyBzYWxtb24gIAogICJPU0tNIGZhY3RvcnMiID0gIiNGRkI3NEQiLCAgIyBCcmlnaHQgcGVhY2ggIAogICJZQVAgS08iID0gIiM5NTc1Q0QiICAjIERlZXAgcGFzdGVsIHB1cnBsZSAgCikKCmNlbGxUeXBlc19jb2xvcnMgPC0gYygKICAiRmlicm9ibGFzdCIgPSAiI0ZGNjk2MSIsICAgIyBTdHJvbmcgUGFzdGVsIFJlZCAgCiAgIktlcmF0aW5vY3l0ZSIgPSAiI0ZGQjM0NyIsICMgU3Ryb25nIFBhc3RlbCBPcmFuZ2UgIAogICJNZWxhbm9jeXRlIiA9ICIjRkZENzAwIiwgICAjIFN0cm9uZyBQYXN0ZWwgWWVsbG93ICAKICAiRW5kb3RoZWxpYWwiID0gIiM3N0RENzciLCAgIyBTdHJvbmcgUGFzdGVsIEdyZWVuICAKICAiTmV1cm9uYWwiID0gIiM3NzlFQ0IiLCAgICAgIyBTdHJvbmcgUGFzdGVsIEJsdWUgIAogICJNZXNlbmNoeW1hbCIgPSAiI0MyN0JBMCIgICAjIFN0cm9uZyBQYXN0ZWwgUHVycGxlICAKKQoKY29uZF9jb2hlbmQgPC0gbGlzdChBPWMoIlNlbmVzY2VudCIpLCAjIGlmIG5vIHZhcmlhYmxlIGlzIGRlZmluZWQsIHdpbGwgYmUgdGhlIGZpcnN0IHRoYXQgYXBwZWFycyBpbiB0aGUgZ2dwbG90CiAgICAgICAgICAgICAgICAgICAgQj1jKCJQcm9saWZlcmF0aXZlIiwiUXVpZXNjZW50IikpCgpQbG90U2NvcmVzKFJlc3VsdHNMaXN0ID0gZGZfc3Nnc2VhLCBDb2xvclZhcmlhYmxlID0gIkNlbGxUeXBlIiwgR3JvdXBpbmdWYXJpYWJsZT0iQ29uZGl0aW9uIiwgIG1ldGhvZCA9InNzR1NFQSIsIENvbG9yVmFsdWVzID0gY2VsbFR5cGVzX2NvbG9ycywgQ29ubmVjdEdyb3Vwcz1UUlVFLCBuY29sID0gMywgbnJvdyA9IDMsIHdpZHRoVGl0bGU9MjAsIHlfbGltaXRzID0gTlVMTCwgbGVnZW5kX25yb3cgPSAyLHhsYWI9TlVMTCwgY29uZF9jb2hlbmQgPSBjb25kX2NvaGVuZCkKCmBgYAoKCgoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9MTB9CgpkZl9yYW5raW5nIDwtIENhbGN1bGF0ZVNjb3JlcyhkYXRhID0gY29ycmNvdW50c19tZXJnZSwgbWV0YWRhdGEgPSBtZXRhZGF0YV9tZXJnZSwgbWV0aG9kID0gInJhbmtpbmciLCBnZW5lX3NldHMgPSBiaWRpcmVjdHNpZ3MpCgpzZW5lc2NlbmNlX3RyaWdnZXJzX2NvbG9ycyA8LSBjKAogICJub25lIiA9ICIjRTU3MzczIiwgICMgU29mdCByZWQgIAogICJSYWRpYXRpb24iID0gIiNCREJEQkQiLCAgIyBNZWRpdW0gZ3JheSAgCiAgIkROQSBkYW1hZ2UiID0gIiM2NEI1RjYiLCAgIyBCcmlnaHRlciBibHVlICAKICAiVGVsb21lcmUgc2hvcnRlbmluZyIgPSAiIzRGQzNGNyIsICAjIFZpdmlkIHNreSBibHVlICAKICAiRE5BIGRlbWV0aHlsYXRpb24iID0gIiNCQTY4QzgiLCAgIyBSaWNoIGxhdmVuZGVyICAKICAiT3hpZGF0aXZlIHN0cmVzcyIgPSAiI0ZERDgzNSIsICAjIFN0cm9uZyB5ZWxsb3cgIAogICJDb25kaXRpb25lZCBNZWRpdW0iID0gIiNGMjk5NEEiLCAgIyBXYXJtIG9yYW5nZSAgCiAgIk9uY29nZW5lIiA9ICIjODFDNzg0IiwgICMgTWVkaXVtIGdyZWVuICAKICAiTGlwaWQgQWNjdW11bGF0aW9uIiA9ICIjRTU3MzczIiwgICMgQ29yYWwgIAogICJDYWxjaXVtIGluZmx1eCIgPSAiIzI2QTY5QSIsICAjIERlZXAgdGVhbCAgCiAgIlBsYXNtYSBtZW1icmFuZSBkeXNydXB0aW9uIiA9ICIjRDMyRjJGIiwgICMgU3Ryb25nIHNhbG1vbiAgCiAgIk9TS00gZmFjdG9ycyIgPSAiI0ZGQjc0RCIsICAjIEJyaWdodCBwZWFjaCAgCiAgIllBUCBLTyIgPSAiIzk1NzVDRCIgICMgRGVlcCBwYXN0ZWwgcHVycGxlICAKKQoKY2VsbFR5cGVzX2NvbG9ycyA8LSBjKAogICJGaWJyb2JsYXN0IiA9ICIjRkY2OTYxIiwgICAjIFN0cm9uZyBQYXN0ZWwgUmVkICAKICAiS2VyYXRpbm9jeXRlIiA9ICIjRkZCMzQ3IiwgIyBTdHJvbmcgUGFzdGVsIE9yYW5nZSAgCiAgIk1lbGFub2N5dGUiID0gIiNGRkQ3MDAiLCAgICMgU3Ryb25nIFBhc3RlbCBZZWxsb3cgIAogICJFbmRvdGhlbGlhbCIgPSAiIzc3REQ3NyIsICAjIFN0cm9uZyBQYXN0ZWwgR3JlZW4gIAogICJOZXVyb25hbCIgPSAiIzc3OUVDQiIsICAgICAjIFN0cm9uZyBQYXN0ZWwgQmx1ZSAgCiAgIk1lc2VuY2h5bWFsIiA9ICIjQzI3QkEwIiAgICMgU3Ryb25nIFBhc3RlbCBQdXJwbGUgIAopCgpjb25kX2NvaGVuZCA8LSBsaXN0KEE9YygiU2VuZXNjZW50IiksICMgaWYgbm8gdmFyaWFibGUgaXMgZGVmaW5lZCwgd2lsbCBiZSB0aGUgZmlyc3QgdGhhdCBhcHBlYXJzIGluIHRoZSBnZ3Bsb3QKICAgICAgICAgICAgICAgICAgICBCPWMoIlByb2xpZmVyYXRpdmUiLCJRdWllc2NlbnQiKSkKClBsb3RTY29yZXMoUmVzdWx0c0xpc3QgPSBkZl9yYW5raW5nLCBDb2xvclZhcmlhYmxlID0gIkNlbGxUeXBlIiwgR3JvdXBpbmdWYXJpYWJsZT0iQ29uZGl0aW9uIiwgIG1ldGhvZCA9InJhbmtpbmciLCBDb2xvclZhbHVlcyA9IGNlbGxUeXBlc19jb2xvcnMsIENvbm5lY3RHcm91cHM9VFJVRSwgbmNvbCA9IDMsIG5yb3cgPSAzLCB3aWR0aFRpdGxlPTIwLCB5X2xpbWl0cyA9IE5VTEwsIGxlZ2VuZF9ucm93ID0gMix4bGFiPU5VTEwsIGNvbmRfY29oZW5kID0gY29uZF9jb2hlbmQpCgpgYGAKCgoKVGVzdGluZyBudW1lcmljIHZhcmlhYmxlcwoKYGBge3J9Cm1ldGFkYXRhX21lcmdlX2NvcnJfMiA8LSBtZXRhZGF0YV9tZXJnZV9jb3JyCm1ldGFkYXRhX21lcmdlX2NvcnJfMiRudW1lcmljX2NvbmRpdGlvbiA8LSBhcy5udW1lcmljKHVuY2xhc3MoZmFjdG9yKG1ldGFkYXRhX21lcmdlX2NvcnJfMiRDb25kaXRpb24pKSkKYGBgCgoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0gCm9wdGlvbnMoZXJyb3I9cmVjb3ZlcikKUGxvdFNjb3JlcyhkYXRhID0gY29ycmNvdW50c19tZXJnZSwgCiAgICAgICAgICAgbWV0YWRhdGEgPSBtZXRhZGF0YV9tZXJnZV9jb3JyXzIsIAogICAgICAgICAgIG1ldGhvZCA9ICJhbGwiLCAKICAgICAgICAgICBnZW5lX3NldHMgPSBiaWRpcmVjdHNpZ3MsICAKICAgICAgICAgICBDb2xvclZhcmlhYmxlID0gTlVMTCwgCiAgICAgICAgICAgVmFyaWFibGU9Im51bWVyaWNfY29uZGl0aW9uIiwgICAKICAgICAgICAgICBDb2xvclZhbHVlcyA9IE5VTEwsIAogICAgICAgICAgIENvbm5lY3RHcm91cHMgPSBULCAKICAgICAgICAgICBuY29sID0gTlVMTCwgCiAgICAgICAgICAgbnJvdyA9IE5VTEwsIAogICAgICAgICAgIHRpdGxlID0gTlVMTCwKICAgICAgICAgICB3aWR0aFRpdGxlID0gMjAsIAogICAgICAgICAgIHRpdGxlc2l6ZSA9IDEwLCAKICAgICAgICAgICBsaW1pdHMgPSBOVUxMLCAKICAgICAgICAgICBsZWdlbmRfbnJvdyA9IE5VTEwsIAogICAgICAgICAgIHBvaW50U2l6ZSA9IDIsCiAgICAgICAgICAgeGxhYiA9ICJ0ZXN0ZSIsIAogICAgICAgICAgIGxhYnNpemUgPSA5LCAKICAgICAgICAgICBjb21wdXRlX2NvaGVuPVRSVUUsIAogICAgICAgICAgIGNvbmRfY29oZW5kID0gTlVMTCwgCiAgICAgICAgICAgcHZhbGNhbGMgPSBGQUxTRSwgCiAgICAgICAgICAgbW9kZSA9ICJzaW1wbGUiLAogICAgICAgICAgIHdpZHRobGVnZW5kPTIyLCAKICAgICAgICAgICBzaWdfdGhyZXNob2xkPTAuMDUsIAogICAgICAgICAgIGNvaGVuX3RocmVzaG9sZD0wLjIsCiAgICAgICAgICAgUG9pbnRTaXplPTYsCiAgICAgICAgICAgY29sb3JQYWxldHRlPSJTZXQzIiwgCiAgICAgICAgICAgY29yPSJwZWFyc29uIikKYGBgCgoKIyMgSGVhdG1hcCBhbmQgVm9sY2FubyBmb3IgQ29oZW4ncyBECgpgYGB7ciBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9Nn0KClNjb3Jlc19PdmVydmlld19BbGwgPC0gUGxvdFNjb3JlcyhkYXRhID0gY29ycmNvdW50c19tZXJnZSwgCiAgICAgICAgICAgbWV0YWRhdGEgPSBtZXRhZGF0YV9tZXJnZSwgIAogICAgICAgICAgIGdlbmVfc2V0cz1iaWRpcmVjdHNpZ3MsIAogICAgICAgICAgIFZhcmlhYmxlPSJDb25kaXRpb24iLCAgCiAgICAgICAgICAgbWV0aG9kID0iYWxsIiwgICAKICAgICAgICAgICBuY29sID0gTlVMTCwgCiAgICAgICAgICAgbnJvdyA9IE5VTEwsIAogICAgICAgICAgIHdpZHRoVGl0bGU9MzAsIAogICAgICAgICAgIGxpbWl0cyA9IE5VTEwsICAgCiAgICAgICAgICAgdGl0bGU9TlVMTCwgCiAgICAgICAgICAgdGl0bGVzaXplID0gMTIsCiAgICAgICAgICAgQ29sb3JWYWx1ZXMgPSBOVUxMLAogICAgICAgICAgIG1vZGUgPSAiZXh0ZW5zaXZlIiwKICAgICAgICAgICB3aWR0aGxlZ2VuZD0yMiwgCiAgICAgICAgICAgc2lnX3RocmVzaG9sZD0wLjA1LCAKICAgICAgICAgICBjb2hlbmRfdGhyZXNob2xkPTAuNiwKICAgICAgICAgICBQb2ludFNpemU9NCwKICAgICAgICAgICBjb2xvclBhbGV0dGU9IlNldDMiKSAgCiAKCgpgYGAKCmBgYHtyIGZpZy53aWR0aD0xNCwgZmlnLmhlaWdodD0xMn0KU2NvcmVzX092ZXJ2aWV3X0FsbCRoZWF0bWFwIApgYGAKCmBgYHtyIGZpZy53aWR0aD0xMywgZmlnLmhlaWdodD01fQpTY29yZXNfT3ZlcnZpZXdfQWxsJHZvbGNhbm8KYGBgCgpgYGB7ciBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTJ9CgpQbG90U2NvcmVzKGRhdGEgPSBjb3JyY291bnRzX21lcmdlLCAKICAgICAgICAgICBtZXRhZGF0YSA9IG1ldGFkYXRhX21lcmdlLCAgCiAgICAgICAgICAgZ2VuZV9zZXRzPWJpZGlyZWN0c2lncywgCiAgICAgICAgICAgR3JvdXBpbmdWYXJpYWJsZT0iQ29uZGl0aW9uIiwgIAogICAgICAgICAgIG1ldGhvZCA9ImFsbCIsICAgCiAgICAgICAgICAgbmNvbCA9IE5VTEwsIAogICAgICAgICAgIG5yb3cgPSBOVUxMLCAKICAgICAgICAgICB3aWR0aFRpdGxlPTMwLCAKICAgICAgICAgICBsaW1pdHMgPSBOVUxMLCAgIAogICAgICAgICAgIHRpdGxlPU5VTEwsIAogICAgICAgICAgIHRpdGxlc2l6ZSA9IDEyLAogICAgICAgICAgIENvbG9yVmFsdWVzID0gTlVMTCwKICAgICAgICAgICBtb2RlID0gInNpbXBsZSIpICAKIAoKYGBgCgoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTI0fSAKIHBsdDIgPC0gUk9DX1Njb3JlcyhkYXRhID0gY29ycmNvdW50c19tZXJnZSwgCiAgICAgICAgICAgbWV0YWRhdGEgPSBtZXRhZGF0YV9tZXJnZV9jb3JyLCAKICAgICAgICAgICBnZW5lX3NldHM9YmlkaXJlY3RzaWdzLCAKICAgICAgICAgICBtZXRob2QgPSAibG9nbWVkaWFuIiwgCiAgICAgICAgICAgdmFyaWFibGUgPSJDb25kaXRpb24iLAogICAgICAgICAgIGNvbG9ycyA9ICJwaW5rIiwgCiAgICAgICAgICAgZ3JpZCA9IFRSVUUsIAogICAgICAgICAgIHNwYWNpbmdfYW5ub3RhdGlvbj0wLjM1LCAKICAgICAgICAgICBuY29sPU5VTEwsIAogICAgICAgICAgIG5yb3c9TlVMTCwKICAgICAgICAgICAgbW9kZSA9ICJzaW1wbGUiLAogICAgICAgICAgICB3aWR0aFRpdGxlID0gMjgpIAoKcGx0MgogCmBgYAoKCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MjR9IAogcGx0MiA8LSBST0NfU2NvcmVzKGRhdGEgPSBjb3JyY291bnRzX21lcmdlLCAKICAgICAgICAgICBtZXRhZGF0YSA9IG1ldGFkYXRhX21lcmdlX2NvcnIsIAogICAgICAgICAgIGdlbmVfc2V0cz1iaWRpcmVjdHNpZ3MsIAogICAgICAgICAgIG1ldGhvZCA9ICJhbGwiLCAKICAgICAgICAgICB2YXJpYWJsZSA9IkNvbmRpdGlvbiIsCiAgICAgICAgICAgY29sb3JzID0gYyhsb2dtZWRpYW4gPSAiIzNFNTU4NyIsIHNzR1NFQSA9ICIjQjY1Mjg1IiwgcmFua2luZyA9ICIjQjY4QzUyIiksIAogICAgICAgICAgIGdyaWQgPSBUUlVFLCAKICAgICAgICAgICBzcGFjaW5nX2Fubm90YXRpb249MC4zNSwgCiAgICAgICAgICAgbmNvbD1OVUxMLCAKICAgICAgICAgICBucm93PU5VTEwsCiAgICAgICAgICAgIG1vZGUgPSAic2ltcGxlIiwKICAgICAgICAgICAgd2lkdGhUaXRsZSA9IDI4KSAKCnBsdDIKIApgYGAKCgpgYGB7ciBmaWcud2lkdGg9MjIsIGZpZy5oZWlnaHQ9MjV9IAogcGx0IDwtIFJPQ19TY29yZXMoZGF0YSA9IGNvcnJjb3VudHNfbWVyZ2UsIAogICAgICAgICAgIG1ldGFkYXRhID0gbWV0YWRhdGFfbWVyZ2VfY29yciwgCiAgICAgICAgICAgZ2VuZV9zZXRzPWJpZGlyZWN0c2lncywgCiAgICAgICAgICAgbWV0aG9kID0gImFsbCIsIAogICAgICAgICAgIHZhcmlhYmxlID0iQ29uZGl0aW9uIiwKICAgICAgICAgICBjb2xvcnMgPSBjKGxvZ21lZGlhbiA9ICIjM0U1NTg3Iiwgc3NHU0VBID0gIiNCNjUyODUiLCByYW5raW5nID0gIiNCNjhDNTIiKSwgCiAgICAgICAgICAgZ3JpZCA9IFRSVUUsIAogICAgICAgICAgIHNwYWNpbmdfYW5ub3RhdGlvbj0wLjM1LCAKICAgICAgICAgICBuY29sPU5VTEwsIAogICAgICAgICAgIG5yb3c9TlVMTCwKICAgICAgICAgICAgbW9kZSA9ICJleHRlbnNpdmUiLAogICAgICAgICAgICB3aWR0aFRpdGxlID0gMjgpIAoKcGx0CiAKYGBgCgoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTE0fQpwbHQgPC0gQVVDX1Njb3JlcyhkYXRhID0gY29ycmNvdW50c19tZXJnZSwgbWV0YWRhdGE9bWV0YWRhdGFfbWVyZ2VfY29yciwgZ2VuZV9zZXRzPWJpZGlyZWN0c2lncywgbWV0aG9kID0gImFsbCIsIG1vZGUgPSAiZXh0ZW5zaXZlIiwgdmFyaWFibGU9IkNvbmRpdGlvbiIsIG5yb3cgPSBOVUxMLCBuY29sID0gTlVMTCwgbGltaXRzID0gTlVMTCwgd2lkdGhUaXRsZSA9IDI4LCB0aXRsZXNpemUgPSAxMiwgQ29sb3JWYWx1ZXMgPSBjKCIjRjlGNEFFIiwgIiNCNDQxNDEiKSwgdGl0bGUgPSBOVUxMKSAKCnBsdApgYGAKCmBgYHtyIGZpZy53aWR0aD0yOCwgZmlnLmhlaWdodD00fQpwbHQgPC0gQVVDX1Njb3JlcyhkYXRhID0gY29ycmNvdW50c19tZXJnZSwgbWV0YWRhdGE9bWV0YWRhdGFfbWVyZ2VfY29yciwgZ2VuZV9zZXRzPWJpZGlyZWN0c2lncywgbWV0aG9kID0gImFsbCIsIHZhcmlhYmxlPSJDb25kaXRpb24iLCBucm93ID0gMSwgbmNvbCA9IE5VTEwsIGxpbWl0cyA9IE5VTEwsIHdpZHRoVGl0bGUgPSAyOCwgdGl0bGVzaXplID0gMTIsIENvbG9yVmFsdWVzID0gYygiI0Y5RjRBRSIsICIjQjQ0MTQxIiksIHRpdGxlID0gTlVMTCkgCgpwbHQKYGBgCgoKIyMgQXNzb2NpYXRpb24gd2l0aCBWYXJpYWJsZQoKSWYgdGhlIHVzZXIgaXMgaW52ZXN0aWdhdGluZyBpZiBhIGNlcnRhaW4gdmFyaWFibGUgY2FuIGJlIGRlc2NyaWJlZCBmcm9tIHRoZSBzY29yZSwgYW5kIG5vdCBhbHJlYWR5IGtub3dpbmcgdGhhdCB2YXJpYWJsZS4gTW9yZSBleHBsb3JhdG9yeS4uLgoKLSBEZWZpbmUgd2hhdCBlYWNoIHZhcmlhYmxlIGlzOiBOdW1lcmljIChpbmNsdWRlcyBpbnRlZ2VyIGlmIHVuaXF1ZSA+IDUpLCBDYXRlZ29yaWNhbCBCaW4gKGludGVnZXIvc3RyaW5nIGlmIHVuaXF1ZSA9PSAyLCBsb2dpY2FsKSwgQ2F0ZWdvcmljYWwgTXVsdGkgKGludGVnZXIgaWYgdW5pcXVlIDwgNSwgc3RyaW5nIGlmIHVuaXF1ZSA+IDIpCi0gRGVmaW5lIGZ1bmN0aW9ucyB0byBjYWxjdWxhdGUgbWV0cmljcyBiYXNlZCBvbiBkaWZmZXJlbnQgZGF0YSB0eXBlczogCi0gQ2F0ZWdvcmljYWwgQmluOiB0LXRlc3Qvd2lsY294b24KLSBDYXRlZ29yaWNhbCBNdWx0aTogQU5PVkEgLyBLcnVza2FsLVdhbGxpcyArIFR1a2V5J3MgdGVzdCAKLSBOdW1lcmljIDogUGVhcnNvbiAvIFNwZWFybWFuIC8gS2VuZGFsbCdzIFRhdQotIFJldHVybiBhIGxpc3Q6Ci0gT25lIGVudHJ5IHBlciB2YXJpYWJsZQotIE1ldGhvZCB1c2VkCi0gRGF0YSBmcmFtZQotIFR3byBjb2x1bW5zOiBtZXRyaWMgYW5kIHAtdmFsdWUKLSBPbmUgbGluZSBwZXIgc3VidmFyaWFibGUgKGlmIE51bWVyaWMgYW5kIENhdGVnb3JpY2FsIEJpbiwgb25seSBvbmUgbGluZTsgZm9yIENhdGVnb3JpY2FsIE11bHRpLCBvbmUgcGVyIGNvbWJpbmF0aW9uIG9mIHZhcmlhYmxlcyk7IG5hbWVkIHJvd3MKLSBQbG90IHJlc3VsdHMKLSBJZiBOdW1lcmljLCBzY2F0dGVyIHBsb3Q7IG1ldHJpYyBvbiB0aGUgdG9wIGxlZnQgY29ybmVyCi0gSWYgQ2F0ZWdvcmljYWwsIGRlbnNpdHkgcGxvdCwgY29sb3JlZCBieSB0aGUgdW5pcXVlIHZhbHVlcyBvZiB0aGUgdmFyaWFibGU7IG1ldHJpY3MgKGlmIG9uZSwgb3IgY29tYmluYXRpb25zIG9mIHZhcmlhYmxlcykgaW4gdG9wIGxlZnQgY29ybmVyCi0gQXJyYW5nZSBpbiBncmlkCgpgYGB7cn0KIyBtZXRhZGF0YV9jb3JyIDwtIENhbGN1bGF0ZVNjb3JlcyhkYXRhID0gY29ycmNvdW50c19tZXJnZSwgbWV0YWRhdGEgPSBtZXRhZGF0YV9tZXJnZV9jb3JyLCBtZXRob2QgPSAic3NHU0VBIiwgZ2VuZV9zZXRzID0gbGlzdChIZXJuYW5kZXpTZWd1cmFfVVA9IFNlbmVzY2VuY2VTaWduYXR1cmVzJGBbVVBdX0hlcm5hbmRlelNlZ3VyYWApKQojIG1ldGFkYXRhX2NvcnIgPC0gbWV0YWRhdGFfY29yciRIZXJuYW5kZXpTZWd1cmFfVVAKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9M30Kb3B0aW9ucyhlcnJvcj1yZWNvdmVyKQpWYXJpYWJsZUFzc29jaWF0aW9uKGRmPW1ldGFkYXRhX2NvcnIsIHRhcmdldF92YXI9InNjb3JlIiwgY29scyA9IGMoIkNvbmRpdGlvbiIsIklzX1NlbmVzY2VudCIsInJhbmRvbV9jYXQiLCJyYW5kb21fbnVtZXJpYyIpLAogICAgICAgICAgICAgICAgICAgIGRpc2NyZXRlX2NvbG9ycyA9IGxpc3QoSXNfU2VuZXNjZW50PWMoIlNlbmVzY2VudCI9InBpbmsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbiBTZW5lc2NlbnQiPSJvcmFuZ2UiKSksIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNfY29sb3IgPSAiIzhDNkQwMyIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yX3BhbGV0dGUgPSAiU2V0MiIsIG5yb3c9MSwgc2l6ZWFubm90PTMsIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKQpgYGAKIApgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQpTY29yZV9WYXJpYWJsZUFzc29jaWF0aW9uKGRhdGE9Y29ycmNvdW50c19tZXJnZSwgbWV0YWRhdGE9bWV0YWRhdGFfbWVyZ2VfY29yciwgY29scyA9IGMoIkNvbmRpdGlvbiIsInJhbmRvbV9jYXQiLCJyYW5kb21fbnVtZXJpYyIpLCBtZXRob2Q9InJhbmtpbmciLCBnZW5lX3NldCA9IGxpc3QoSGVybmFuZGV6U2VndXJhPWJpZGlyZWN0c2lncyRIZXJuYW5kZXpTZWd1cmEpLCBtb2RlID0gImV4dGVuc2l2ZSIsIG5vbnNpZ25pZl9jb2xvciA9ICJ3aGl0ZSIsIHNpZ25pZl9jb2xvciA9ICJyZWQiLCBzYXR1cmF0aW9uX3ZhbHVlPU5VTEwsc2lnX3RocmVzaG9sZCA9IDAuMDUsIHdpZHRobGFiZWxzPTI5LCBsYWJzaXplPTEwLCB0aXRsZXNpemU9MTQsIHBvaW50U2l6ZT01KQoKYGBgCiAKIApgYGB7ciBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD04fQpvcHRpb25zKGVycm9yPXJlY292ZXIpClNjb3JlX1ZhcmlhYmxlQXNzb2NpYXRpb24oZGF0YT1jb3JyY291bnRzX21lcmdlLCBtZXRhZGF0YT1tZXRhZGF0YV9tZXJnZV9jb3JyLCBjb2xzID0gYyggInJhbmRvbV9udW1lcmljIiksIG1ldGhvZD0icmFua2luZyIsIGdlbmVfc2V0ID0gbGlzdChIZXJuYW5kZXpTZWd1cmE9YmlkaXJlY3RzaWdzJEhlcm5hbmRlelNlZ3VyYSksIG1vZGUgPSAiZXh0ZW5zaXZlIiwgbm9uc2lnbmlmX2NvbG9yID0gIndoaXRlIiwgc2lnbmlmX2NvbG9yID0gInJlZCIsIHNhdHVyYXRpb25fdmFsdWU9TlVMTCxzaWdfdGhyZXNob2xkID0gMC4wNSwgd2lkdGhsYWJlbHM9MjksIGxhYnNpemU9MTAsIHRpdGxlc2l6ZT0xNCwgcG9pbnRTaXplPTUpCgpgYGAKCiMgSW5kaXZpZHVhbCBHZW5lcwoKIyMjIFZpb2xpbiBFeHByZXNzaW9uIFBsb3RzCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQoKCnNlbmVzY2VuY2VfdHJpZ2dlcnNfY29sb3JzIDwtIGMoCiAgIm5vbmUiID0gIiNFNTczNzMiLCAgIyBTb2Z0IHJlZCAgCiAgIlJhZGlhdGlvbiIgPSAiI0JEQkRCRCIsICAjIE1lZGl1bSBncmF5ICAKICAiRE5BIGRhbWFnZSIgPSAiIzY0QjVGNiIsICAjIEJyaWdodGVyIGJsdWUgIAogICJUZWxvbWVyZSBzaG9ydGVuaW5nIiA9ICIjNEZDM0Y3IiwgICMgVml2aWQgc2t5IGJsdWUgIAogICJETkEgZGVtZXRoeWxhdGlvbiIgPSAiI0JBNjhDOCIsICAjIFJpY2ggbGF2ZW5kZXIgIAogICJPeGlkYXRpdmUgc3RyZXNzIiA9ICIjRkREODM1IiwgICMgU3Ryb25nIHllbGxvdyAgCiAgIkNvbmRpdGlvbmVkIE1lZGl1bSIgPSAiI0YyOTk0QSIsICAjIFdhcm0gb3JhbmdlICAKICAiT25jb2dlbmUiID0gIiM4MUM3ODQiLCAgIyBNZWRpdW0gZ3JlZW4gIAogICJMaXBpZCBBY2N1bXVsYXRpb24iID0gIiNFNTczNzMiLCAgIyBDb3JhbCAgCiAgIkNhbGNpdW0gaW5mbHV4IiA9ICIjMjZBNjlBIiwgICMgRGVlcCB0ZWFsICAKICAiUGxhc21hIG1lbWJyYW5lIGR5c3J1cHRpb24iID0gIiNEMzJGMkYiLCAgIyBTdHJvbmcgc2FsbW9uICAKICAiT1NLTSBmYWN0b3JzIiA9ICIjRkZCNzREIiwgICMgQnJpZ2h0IHBlYWNoICAKICAiWUFQIEtPIiA9ICIjOTU3NUNEIiAgIyBEZWVwIHBhc3RlbCBwdXJwbGUgIAopCgoKSW5kaXZpZHVhbEdlbmVzX1Zpb2xpbnMoZGF0YSA9IGNvcnJjb3VudHNfbWVyZ2UsIG1ldGFkYXRhID0gbWV0YWRhdGFfbWVyZ2UsIGdlbmVzID0gYygiQ0RLTjFBIiwgIkNES04yQSIsICJHTEIxIiwiVFA1MyIsIkNDTDIiKSwgR3JvdXBpbmdWYXJpYWJsZSA9ICJDb25kaXRpb24iLCBwbG90PVQsIG5jb2w9TlVMTCwgbnJvdz0yLCBkaXZpZGU9IkNlbGxUeXBlIiwgaW52ZXJ0X2RpdmlkZT1GQUxTRSxDb2xvclZhbHVlcz1zZW5lc2NlbmNlX3RyaWdnZXJzX2NvbG9ycywgcG9pbnRTaXplPTIsIENvbG9yVmFyaWFibGU9IlNlbmVzY2VudFR5cGUiLCB0aXRsZT0iU2VuZXNjZW5jZSIsIHdpZHRoVGl0bGU9MTYseV9saW1pdHMgPSBOVUxMLGxlZ2VuZF9ucm93PTQsIHhsYWI9IkNvbmRpdGlvbiIsY29sb3JsYWI9IiIpIApgYGAKCgoKIyMjIENvcnJlbGF0aW9uIEhlYXRtYXAKCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQpvcHRpb25zKGVycm9yPXJlY292ZXIpCkNvcnJlbGF0aW9uSGVhdG1hcChkYXRhPWNvcnJjb3VudHNfbWVyZ2UsIAogICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBtZXRhZGF0YV9tZXJnZSwgCiAgICAgICAgICAgICAgICAgICBnZW5lcz1jKCJDREtOMUEiLCAiQ0RLTjJBIiwgIkdMQjEiLCJUUDUzIiwiQ0NMMiIpLCAKICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlLmJ5ID0gIkNvbmRpdGlvbiIsIAogICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInBlYXJzb24iLCAgCiAgICAgICAgICAgICAgICAgICBjb2xvcmxpc3QgPSBsaXN0KGxvdyA9ICIjM0Y0MTkzIiwgbWlkID0gIiNGOUY0QUUiLCBoaWdoID0gIiNCNDQxNDEiKSwKICAgICAgICAgICAgICAgICAgIGxpbWl0c19jb2xvcnNjYWxlID0gYygtMSwwLDEpLCAKICAgICAgICAgICAgICAgICAgIHdpZHRoVGl0bGUgPSAxNiwgCiAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJ0ZXN0IiwgCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IFRSVUUsICAKICAgICAgICAgICAgICAgICAgIGRldGFpbGVkcmVzdWx0cyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbj0icmlnaHQiLAogICAgICAgICAgICAgICAgICAgdGl0bGVzaXplPTIwKQoKCmBgYAoKCgoKIyMjIEV4cHJlc3Npb24gSGVhdG1hcHMKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00fQpvcHRpb25zKGVycm9yPXJlY292ZXIpCgphbm5vdGF0aW9uX2NvbG9ycyA8LSBsaXN0KAogIENlbGxUeXBlID0gYygKICAgICJGaWJyb2JsYXN0IiAgID0gIiNGRjY5NjEiLCAgICMgU3Ryb25nIFBhc3RlbCBSZWQgIAogICAgIktlcmF0aW5vY3l0ZSIgPSAiI0ZGQjM0NyIsICAgIyBTdHJvbmcgUGFzdGVsIE9yYW5nZSAgCiAgICAiTWVsYW5vY3l0ZSIgICA9ICIjRkZENzAwIiwgICAjIFN0cm9uZyBQYXN0ZWwgWWVsbG93ICAKICAgICJFbmRvdGhlbGlhbCIgID0gIiM3N0RENzciLCAgICMgU3Ryb25nIFBhc3RlbCBHcmVlbiAgCiAgICAiTmV1cm9uYWwiICAgICA9ICIjNzc5RUNCIiwgICAjIFN0cm9uZyBQYXN0ZWwgQmx1ZSAgCiAgICAiTWVzZW5jaHltYWwiICA9ICIjQzI3QkEwIiAgICAjIFN0cm9uZyBQYXN0ZWwgUHVycGxlICAKICApLAogIENvbmRpdGlvbiA9IGMoCiAgICAiU2VuZXNjZW50IiAgICAgPSAiIzY1QUM3QyIsICAjIEV4YW1wbGUgY29sb3I6IGdyZWVuaXNoCiAgICAiUHJvbGlmZXJhdGl2ZSIgPSAiIzVGOTBENCIsICAjIEV4YW1wbGUgY29sb3I6IGJsdWVpc2gKICAgICJRdWllc2NlbnQiICAgICA9ICIjRURBMDNFIiAgICMgRXhhbXBsZSBjb2xvcjogb3JhbmdlCiAgKQopCgpFeHByZXNzaW9uSGVhdG1hcChkYXRhPWNvcnJjb3VudHNfbWVyZ2UsIAogICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IG1ldGFkYXRhX21lcmdlLCAKICAgICAgICAgICAgICAgICAgZ2VuZXM9YygiQ0RLTjFBIiwgIkNES04yQSIsICJHTEIxIiwiVFA1MyIsIkNDTDIiKSwgIAogICAgICAgICAgICAgICAgICBhbm5vdGF0ZS5ieSA9IGMoIkNlbGxUeXBlIiwiQ29uZGl0aW9uIiksCiAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvcnMsCiAgICAgICAgICAgICAgICAgIGNvbG9ybGlzdCA9IGxpc3QobG93ID0gIiMzRjQxOTMiLCBtaWQgPSAiI0Y5RjRBRSIsIGhpZ2ggPSAiI0I0NDE0MSIpLAogICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgIHRpdGxlID0gInRlc3QiLCAKICAgICAgICAgICAgICAgICAgdGl0bGVzaXplID0gMjAsCiAgICAgICAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9ICJyaWdodCIsCiAgICAgICAgICAgICAgICAgIHNjYWxlX3Bvc2l0aW9uPSJyaWdodCIpCgpgYGAKCgoKIyMjIFJPQy9BVUMgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NH0KCmNlbGxUeXBlc19jb2xvcnMgPC0gYygKICAiRmlicm9ibGFzdCIgPSAiI0ZGNjk2MSIsICAgIyBTdHJvbmcgUGFzdGVsIFJlZCAgCiAgIktlcmF0aW5vY3l0ZSIgPSAiI0ZGQjM0NyIsICMgU3Ryb25nIFBhc3RlbCBPcmFuZ2UgIAogICJNZWxhbm9jeXRlIiA9ICIjRkZENzAwIiwgICAjIFN0cm9uZyBQYXN0ZWwgWWVsbG93ICAKICAiRW5kb3RoZWxpYWwiID0gIiM3N0RENzciLCAgIyBTdHJvbmcgUGFzdGVsIEdyZWVuICAKICAiTmV1cm9uYWwiID0gIiM3NzlFQ0IiLCAgICAgIyBTdHJvbmcgUGFzdGVsIEJsdWUgIAogICJNZXNlbmNoeW1hbCIgPSAiI0MyN0JBMCIgICAjIFN0cm9uZyBQYXN0ZWwgUHVycGxlICAKKQoKUk9DYW5kQVVDcGxvdChjb3JyY291bnRzX21lcmdlLCAKICAgICAgICAgICAgICBtZXRhZGF0YV9tZXJnZSwgCiAgICAgICAgICAgICAgY29uZGl0aW9uX3ZhciA9ICJDb25kaXRpb24iLCAKICAgICAgICAgICAgICBjbGFzcyA9ICJTZW5lc2NlbnQiLCAKICAgICAgICAgICAgICBnZW5lcz1jKCJDREtOMUEiLCAiQ0RLTjJBIiwgIkdMQjEiLCJUUDUzIiwiQ0NMMiIpLCAKICAgICAgICAgICAgICBncm91cF92YXI9IkNlbGxUeXBlIiwKICAgICAgICAgICAgICBwbG90X3R5cGUgPSAiYWxsIiwKICAgICAgICAgICAgICBoZWF0bWFwX3BhcmFtcyA9IGxpc3QoY29sID0gbGlzdCggIiNGOUY0QUUiICwiI0I0NDE0MSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuNSwxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzPVQpLAogICAgICAgICAgICAgIHJvY19wYXJhbXMgPSBsaXN0KG5yb3c9MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNlbGxUeXBlc19jb2xvcnMpLAogICAgICAgICAgICAgIGNvbW1vbXBsb3RfcGFyYW1zID0gbGlzdCh3aWR0aHM9YygwLjUsMC41KSkpCgoKYGBgCgojIyMgQ29oZW4ncyBkCgpgYGB7cn0KQ29oZW5ESGVhdG1hcChjb3JyY291bnRzX21lcmdlLCAKICAgICAgICAgICAgICBtZXRhZGF0YV9tZXJnZSwgCiAgICAgICAgICAgICAgZ2VuZXM9YygiQ0RLTjFBIiwgIkNES04yQSIsICJHTEIxIiwiVFA1MyIsIkNDTDIiKSwKICAgICAgICAgICAgICBjb25kaXRpb25fdmFyID0gIkNvbmRpdGlvbiIsIAogICAgICAgICAgICAgIGNsYXNzID0gIlNlbmVzY2VudCIsIAogICAgICAgICAgICAgIGdyb3VwX3ZhciA9ICJDZWxsVHlwZSIsCiAgICAgICAgICAgICAgdGl0bGUgPSBOVUxMLAogICAgICAgICAgICAgIHdpZHRoVGl0bGUgPSAxNiwKICAgICAgICAgICAgICBoZWF0bWFwX3BhcmFtcyA9IGxpc3QoY29sID0gbGlzdCggIiNGOUY0QUUiICwiI0I0NDE0MSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3M9VCkpCmBgYAoKIyMjIFBDQSB3aXRoIGdlbmVzIGZyb20gc2lnbmF0dXJlIG9ubHkKCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9CgpDZWxsVHlwZWNvbHMgPSBjKAogICJGaWJyb2JsYXN0IiAgID0gIiNGRjY5NjEiLCAgICMgU3Ryb25nIFBhc3RlbCBSZWQgIAogICJLZXJhdGlub2N5dGUiID0gIiNGRkIzNDciLCAgICMgU3Ryb25nIFBhc3RlbCBPcmFuZ2UgIAogICJNZWxhbm9jeXRlIiAgID0gIiNGRkQ3MDAiLCAgICMgU3Ryb25nIFBhc3RlbCBZZWxsb3cgIAogICJFbmRvdGhlbGlhbCIgID0gIiM3N0RENzciLCAgICMgU3Ryb25nIFBhc3RlbCBHcmVlbiAgCiAgIk5ldXJvbmFsIiAgICAgPSAiIzc3OUVDQiIsICAgIyBTdHJvbmcgUGFzdGVsIEJsdWUgIAogICJNZXNlbmNoeW1hbCIgID0gIiNDMjdCQTAiICAgICMgU3Ryb25nIFBhc3RlbCBQdXJwbGUgIAopCgpzZW5jb2xzIDwtIGMoCiAgIlNlbmVzY2VudCIgPSAiI0QzMkYyRiIsICAjIFN0cm9uZyBzYWxtb24gIAogICJRdWllc2NlbnQiID0gIiNGRkI3NEQiLCAgIyBCcmlnaHQgcGVhY2ggIAogICJQcm9saWZlcmF0aXZlIiA9ICIjOTU3NUNEIiAgIyBEZWVwIHBhc3RlbCBwdXJwbGUgIAopCgpwbG90UENBKGRhdGE9Y29ycmNvdW50c19tZXJnZSwgCiAgICAgICAgbWV0YWRhdGE9bWV0YWRhdGFfbWVyZ2UsIAogICAgICAgIGdlbmVzPWMoIkNES04xQSIsICJDREtOMkEiLCAiR0xCMSIsIlRQNTMiLCJDQ0wyIiksIAogICAgICAgIHNjYWxlPUZBTFNFLCAKICAgICAgICBjZW50ZXI9VFJVRSwgCiAgICAgICAgUENzPWxpc3QoYygxLDIpLCBjKDIsMyksIGMoMyw0KSksIAogICAgICAgIENvbG9yVmFyaWFibGU9IkNvbmRpdGlvbiIsCiAgICAgICAgQ29sb3JWYWx1ZXM9c2VuY29scywKICAgICAgICBwb2ludFNpemU9NSwKICAgICAgICBsZWdlbmRfbnJvdz0xLCAKICAgICAgICBuY29sPTMsIAogICAgICAgIG5yb3c9TlVMTCkKYGBgCgoKIyBFbnJpY2htZW50LWJhc2VkCgojIyBHU0VBCgoKYGBge3J9Cm9wdGlvbnMoZXJyb3I9cmVjb3ZlcikKZGVnZW5lcyA8LSBjYWxjdWxhdGVERShkYXRhPWNvcnJjb3VudHNfbWVyZ2UsIAogICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhPW1ldGFkYXRhX21lcmdlLCAKICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM9IkNvbmRpdGlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgIGxtZXhwcmVzc2lvbiA9IE5VTEwsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsbWF0ID0gTlVMTCwgCiAgICAgICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gYygiU2VuZXNjZW50IC0gUHJvbGlmZXJhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuZXNjZW50IC0gUXVpZXNjZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9saWZlcmF0aXZlIC0gUXVpZXNjZW50IikpIAoKZGVnZW5lcwpgYGAKCmBgYHtyIGZpZy53aWR0aD0yMSwgZmlnLmhlaWdodD02fQpvcHRpb25zKGVycm9yPXJlY292ZXIpCnBsb3RWb2xjYW5vKERFUmVzdWx0c0xpc3Q9ZGVnZW5lcywgZ2VuZXM9YmlkaXJlY3RzaWdzLCBOPU5VTEwsIHg9ImxvZ0ZDIix5PSItbG9nMTAoYWRqLlAuVmFsKSIsIHBvaW50U2l6ZT0yLCBjb2xvcj0icGluayIsIGhpZ2hsaWdodGNvbG9yPSJkYXJrYmx1ZSIsIGhpZ2hsaWdodGNvbG9yX3VwcmVnID0gIiMwMzhDNjUiLCBoaWdobGlnaHRjb2xvcl9kb3ducmVnID0gIiM4QzAzMDMiLCBub2ludGVyZXN0Y29sb3I9ImdyZXkiLHRocmVzaG9sZF95PU5VTEwsIHRocmVzaG9sZF94PU5VTEwsIHhsYWI9TlVMTCwgeWxhYj1OVUxMLCBuY29sPU5VTEwsIG5yb3c9TlVMTCwgdGl0bGU9TlVMTCxsYWJzaXplPTcsd2lkdGhsYWJzPTI1LCBpbnZlcnQ9VCkKCmBgYAoKCgpgYGB7cn0Kb3B0aW9ucyhlcnJvcj1yZWNvdmVyKQpHU0VBcmVzdWx0cyA8LSBydW5HU0VBKGRlZ2VuZXMsIGJpZGlyZWN0c2lncywgc3RhdCA9IE5VTEwpCkdTRUFyZXN1bHRzCmBgYAoKCmBgYHtyIGZpZy53aWR0aD0yNSwgZmlnLmhlaWdodD0xMH0KcGxvdEdTRUFlbnJpY2htZW50KEdTRUFfcmVzdWx0cz1HU0VBcmVzdWx0cywgREVHTGlzdD1kZWdlbmVzLCBnZW5lX3NldHM9YmlkaXJlY3RzaWdzLCB3aWR0aFRpdGxlPTMyLGdyaWQgPSBULCB0aXRsZXNpemUgPSAxMCwgbnJvdz0zLCBuY29sPTkpIApgYGAKCmBgYHtyIGZpZy53aWR0aD0xOCwgZmlnLmhlaWdodD00fQpvcHRpb25zKGVycm9yPXJlY292ZXIpCnBsb3RORVNsb2xsaXBvcChHU0VBX3Jlc3VsdHM9R1NFQXJlc3VsdHMsIHNpZ190aHJlc2hvbGQgPSAwLjA1LHNhdHVyYXRpb25fdmFsdWU9MC4wMDAwMSwgbm9uc2lnbmlmX2NvbG9yID0gIndoaXRlIiwgc2lnbmlmX2NvbG9yID0gInJlZCIsCiAgICAgICAgICAgICAgICBncmlkID0gVCwgbnJvdyA9IDEsIG5jb2wgPSBOVUxMLCB3aWR0aGxhYmVscz0yOCwgdGl0bGU9TlVMTCkKCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQuNX0KcGxvdENvbWJpbmVkR1NFQShHU0VBcmVzdWx0cywgc2lnX3RocmVzaG9sZCA9IDAuMDUsIFBvaW50U2l6ZT05LCB3aWR0aGxlZ2VuZCA9IDI2ICkKYGBgCgoKCgojIyBBc3NvY2lhdGlvbiB3aXRoIFBoZW5vdHlwZQoKCklmIHRoZSB1c2VyIGlzIGludmVzdGlnYXRpbmcgaWYgYSBjZXJ0YWluIHZhcmlhYmxlIGNhbiBiZSBkZXNjcmliZWQgZnJvbSB0aGUgR1NFQSByZXN1bHRzLCBhbmQgbm90IGFscmVhZHkga25vd2luZyB0aGF0IHZhcmlhYmxlLiBNb3JlIGV4cGxvcmF0b3J5Li4uCgotIEZvciBlYWNoIHZhcmlhYmxlLCBkZWZpbmUgYWxsIHBvc3NpYmxlIGNvbnRyYXN0cyAoZS5nLiBpZiBBLEIsQywgdGhlbiBjb25zaWRlciBBLUIsIEEtQywgQi1DLEEtKEIrQykvMiwgZXRjLi4uKQotIFVzZSBjYWxjdWxhdGVERSB3aXRob3V0IGJhc2VsaW5lIGFuZCBhbGwgcG9zc2libGUgY29udHJhc3RzCi0gcGVyZm9ybSBHU0VBIGFuZCBjb2xsZWN0IGFsbCByZXN1bHRzIGluIG9ubHkgb25lIHRhYmxlCi0gUGxvdCBhbGwgcmVzdWx0cyBpbiBsb2xsaXBvcCBwbG90cywgeSBheGlzIHdpdGggYWxsIGNvbnRyYXN0cwoKLSBPbmUgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGFsbCByZXN1bHRzOyBvbmUgdG8gZG8gdGhlIGxvbGx5cG9wIHBsb3QKCgoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9Nn0Kb3B0aW9ucyhlcnJvcj1yZWNvdmVyKQpkZl90ZXN0IDwtIEdTRUFfVmFyaWFibGVBc3NvY2lhdGlvbihkYXRhPWNvcnJjb3VudHNfbWVyZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YT1tZXRhZGF0YV9tZXJnZV9jb3JyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scz1jKCJDb25kaXRpb24iLCJJc19TZW5lc2NlbnQiLCJyYW5kb21fY2F0IiwicmFuZG9tX251bWVyaWMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9ImV4dGVuc2l2ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX3NldD1saXN0KEhlcm5hbmRlelNlZ3VyYT1iaWRpcmVjdHNpZ3MkSGVybmFuZGV6U2VndXJhKSwgIHNhdHVyYXRpb25fdmFsdWU9MC4wMDAwMDAwMDEsIG5vbnNpZ25pZl9jb2xvciA9ICJ3aGl0ZSIsIHNpZ25pZl9jb2xvciA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdfdGhyZXNob2xkID0gMC4wNSwgd2lkdGhsYWJlbHM9MzAsIGxhYnNpemU9MTAsIHRpdGxlc2l6ZT0xNCkgCgpkZl90ZXN0JHBsb3QKCmBgYAoKCgpgYGB7cn0KIyBtZXRhZGF0YV9jb3JyXzEgPC0gQ2FsY3VsYXRlU2NvcmVzKGRhdGEgPSBjb3JyY291bnRzX21lcmdlLCBtZXRhZGF0YSA9IG1ldGFkYXRhX21lcmdlX2NvcnIsIG1ldGhvZCA9ICJzc0dTRUEiLCBnZW5lX3NldHMgPSBsaXN0KEhlcm5hbmRlelNlZ3VyYT1iaWRpcmVjdHNpZ3MkSGVybmFuZGV6U2VndXJhKSApCiMgbWV0YWRhdGFfY29yciA8LSBtZXRhZGF0YV9jb3JyXzEkYEhlcm5hbmRlelNlZ3VyYWAKIyBtZXRhZGF0YV9jb3JyCmBgYAoKYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9MTB9ClZhcmlhYmxlQXNzb2NpYXRpb24oZGY9bWV0YWRhdGFfY29yciwgY29scz1jKCJDb25kaXRpb24iLCJJc19TZW5lc2NlbnQiLCJyYW5kb21fY2F0IiwicmFuZG9tX251bWVyaWMiKSwgCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Zhcj0ic2NvcmUiLCB0YXJnZXR2YXJfbGFiPSJTY29yZSIsCiAgICAgICAgICAgICAgICAgICAgZGlzY3JldGVfY29sb3JzID0gbGlzdChJc19TZW5lc2NlbnQ9YygiU2VuZXNjZW50Ij0icGluayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uIFNlbmVzY2VudCI9Im9yYW5nZSIpKSwgCiAgICAgICAgICAgICAgICAgICAgY29udGludW91c19jb2xvciA9ICIjOEM2RDAzIiwKICAgICAgICAgICAgICAgICAgICBjb2xvcl9wYWxldHRlID0gIlNldDIiLAogICAgICAgICAgICAgICAgICAgIHNpemVhbm5vdD0zLCBuY29sPTEsIG5yb3c9NCwKICAgICAgICAgICAgICAgICAgICBudW1lcmljID0gInBlYXJzb24iLAogICAgICAgICAgICAgICAgICAgIGNhdGVnb3JpY2FsX2JpbiA9ICJ0LnRlc3QiLAogICAgICAgICAgICAgICAgICAgIGNhdGVnb3JpY2FsX211bHRpID0gImFub3ZhIiwgdGl0bGU9TlVMTCwgdGl0bGVzaXplPTE0LAogICAgICAgICAgICAgICAgICAgIG5vbnNpZ25pZl9jb2xvciA9ICJ3aGl0ZSIsIHNpZ25pZl9jb2xvciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uX3ZhbHVlPU5VTEwsc2lnX3RocmVzaG9sZCA9IDAuMDUsIHdpZHRobGFiZWxzPTE0LCBwb2ludFNpemU9NSwgaGVpZ2h0cz1jKDAuMywwLjIsMC4zLDAuMikpIApgYGAKCgoKCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD01fQpvcHRpb25zKGVycm9yPXJlY292ZXIpCmRmX3Rlc3QgPC0gR1NFQV9WYXJpYWJsZUFzc29jaWF0aW9uKGRhdGE9Y29ycmNvdW50c19tZXJnZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhPW1ldGFkYXRhX21lcmdlX2NvcnIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzPWMoIkNvbmRpdGlvbiIgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9Im1lZGl1bSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX3NldD1saXN0KEhlcm5hbmRlelNlZ3VyYV9VUD1TZW5lc2NlbmNlU2lnbmF0dXJlcyRgW1VQXV9IZXJuYW5kZXpTZWd1cmFgICksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uX3ZhbHVlPTAuMDAwMDAwMDAxLCBub25zaWduaWZfY29sb3IgPSAid2hpdGUiLCBzaWduaWZfY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnX3RocmVzaG9sZCA9IDAuMDUsIHdpZHRobGFiZWxzPTMwLCBsYWJzaXplPTEwLCB0aXRsZXNpemU9MTQpIAoKZGZfdGVzdCRwbG90CgpkZl90ZXN0IDwtIEdTRUFfVmFyaWFibGVBc3NvY2lhdGlvbihkYXRhPWNvcnJjb3VudHNfbWVyZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YT1tZXRhZGF0YV9tZXJnZV9jb3JyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scz1jKCJDb25kaXRpb24iICksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPSJtZWRpdW0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9zZXQ9bGlzdCggSGVybmFuZGV6U2VndXJhX0JpZGlyZWN0X1VQPXN1YnNldChiaWRpcmVjdHNpZ3MkSGVybmFuZGV6U2VndXJhLCBlbnJpY2htZW50PT0xKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uX3ZhbHVlPTAuMDAwMDAwMDAxLCBub25zaWduaWZfY29sb3IgPSAid2hpdGUiLCBzaWduaWZfY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnX3RocmVzaG9sZCA9IDAuMDUsIHdpZHRobGFiZWxzPTMwLCBsYWJzaXplPTEwLCB0aXRsZXNpemU9MTQpIAoKZGZfdGVzdCRwbG90CgoKYGBgCg==